@abco20/btxml-checker 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +29 -28
- package/dist/config.d.ts +3 -3
- package/dist/config.js +1 -1
- package/dist/editor-node.d.ts +7 -7
- package/dist/editor-node.js +22 -22
- package/dist/editor.d.ts +7 -7
- package/dist/editor.js +16 -16
- package/dist/{effective-t_u6qJ-7.d.ts → effective-Dmz864HF.d.ts} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +10 -10
- package/dist/model.d.ts +2 -2
- package/dist/model.js +3 -3
- package/dist/{public-types-Cp3bKKQ3.d.ts → public-types-D3_VR6Sy.d.ts} +5 -5
- package/dist/{public-types-DCvVgnqw.d.ts → public-types-zg51kxSL.d.ts} +9 -0
- package/dist/rules.d.ts +24 -6
- package/dist/rules.js +4 -3
- package/dist/semantic.d.ts +6 -6
- package/dist/semantic.js +3 -3
- package/dist/server.cjs +336 -5
- package/dist/server.cjs.map +1 -1
- package/dist/{types-f9KgrQFd.d.ts → types-BIuA9iLZ.d.ts} +2 -2
- package/dist/{types-BRzExVMv.d.ts → types-DPS-KRMY.d.ts} +2 -2
- package/dist/{types-B2hnkNNL.d.ts → types-DkQEPPAM.d.ts} +2 -2
- package/dist/{types-BgqDzlJ8.d.ts → types-H6H-_Z3F.d.ts} +12 -0
- package/package.json +1 -1
- package/schemas/btxml.config.schema.json +10 -0
package/dist/cli.js
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{hideBin as dm}from"yargs/helpers";import cm from"yargs/yargs";import{z as en}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",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"},Ol=Object.values(u).sort();var $l=en.object({subTreePorts:en.enum(["loose","strict"]).optional()}).strict(),Ul=en.object({allowStringEntryCompatibility:en.boolean().optional()}).strict(),z={"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:$l,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:Ul,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."},"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 tn=["off","info","warn","error"];var Nr={linter:{rules:{"xml/require-btcpp-format":"error","xml/no-unknown-top-level-element":"error","model/no-unknown-node":"error","model/no-unknown-port":["error",{subTreePorts:"strict"}],"script/no-unknown-variable":"error","model/no-childless-control-shape-mismatch":"error","model/no-leaf-block-shape":"error","model/valid-child-count":"error","suppression/no-unused":"error","suppression/require-reason":"warn"}}},Vl={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function Kn(){return structuredClone(Vl)}function kt(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 E(e,t,n,o,r="",i,s){return{code:e,severity:t,message:n,uri:r,...o?{range:o}:{},...i?{details:i}:{},...s?{data:s}:{}}}function st(e,t,n){return{line:e,character:t,offset:n}}function C(e,t){return{start:e,end:t}}function Rt(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 ql=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function Hn(e){return{ok:!0,reference:e}}function Me(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Pr(e){return ql.test(e)}function Mr(e){if(!e)return Me("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Pr(t)?{ok:!0,scope:"global",key:t}:Me("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):Me("empty-key",e,"Global blackboard reference key must not be empty")}return Pr(e)?{ok:!0,scope:"local",key:e}:Me("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function Q(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return Hn({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return Me("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return Me("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let o=n.slice(1,-1).trim(),r=Mr(o);return r.ok?Hn({scope:r.scope,key:r.key,raw:n,syntax:"braced"}):r}function nn(e){let{rawName:t}=e;if(!t.startsWith("@"))return Me("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Mr(t);return n.ok?n.scope!=="global"?Me("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):Hn({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function on(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function Ee(e){return`${e.scope}:${e.key}`}var Xl={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Gl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function ge(e,t){return e.attributes.find(n=>n.name===t)}function zl(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Wl(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Kl(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Br(e,t){let n=e.line,o=e.character,r=e.offset;for(let i of t){if(r+=i.length,i===`
|
|
3
|
-
`){n+=1,o=0;continue}o+=
|
|
4
|
-
`||t==="\r")return"port names must not contain whitespace";let o=ld.get(t);if(o)return o}}function Or(e,t){let n=t.direction??"input";return{source:"config",name:e,direction:n,type:t.type,defaultValue:t.default,description:t.description,required:t.required??((n==="input"||n==="inout")&&t.default===void 0),enum:t.enum}}function Tt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,o])=>Or(n,o))}}var dd=[{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"]}],Dt=new Map,$r=new Map;for(let e of dd){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};$r.set(e.name,t),Dt.set(e.name,e.name);for(let n of e.aliases)Dt.set(n,e.name)}function cd(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 Qn(e){return Dt.get(e)??e}function ud(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 Ct(e){return Dt.get(e)}function at(e=[]){let t=new Map,n=new Map(Dt);for(let o of $r.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[r,i]of Object.entries(o.types??{})){let s=Qn(i.canonical??r),l=t.get(s)??cd(r,s,i);l.name=r,l.kind=i.kind,l.canonical=s,l.source="augmentation",l.validate=i.validate??l.validate,l.aliases.add(r),l.aliases.add(s);for(let d of i.aliases??[])l.aliases.add(d);for(let d of i.compatibleWith??[])l.compatibleWith.add(d);t.set(s,l),n.set(r,s),n.set(s,s);for(let d of i.aliases??[])n.set(d,s)}for(let o of t.values())o.compatibleWith=new Set([...o.compatibleWith].map(r=>n.get(r)??Qn(r))),o.compatibleWith.delete(o.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([o,r])=>[o,ud(r)])),namesToCanonical:n}}function ue(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Qn(t),o=e.entriesByCanonical.get(n);return o||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function rn(e,t){return ue(e,t)?.canonical}function It(e,t,n){let o=ue(e,t),r=ue(e,n);return!o||!r?!1:o.kind==="any"||r.kind==="any"||o.canonical===r.canonical?!0:o.compatibleWith.includes(r.canonical)||r.compatibleWith.includes(o.canonical)}var Ur=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<bool, std::allocator<bool> > >",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<double, std::allocator<double> > >",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<int, std::allocator<int> > >",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once bu the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written int othe output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],Vr={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 qr=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<bool, std::allocator<bool> > >",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<double, std::allocator<double> > >",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<int, std::allocator<int> > >",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once by the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written into the output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],Xr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Gr=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once by the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written into the output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"TryCatch",kind:"Control",ports:[{name:"catch_on_halt",direction:"input",type:"bool",defaultValue:"false",description:"If true, execute the catch child when the node is halted during the try-block",required:!1}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],zr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Wr=["4.6.2","4.8.2","4.9.0"],eo="4.9.0",Et={"4.6.2":{models:Ur,genericSubTreeModel:Vr},"4.8.2":{models:qr,genericSubTreeModel:Xr},"4.9.0":{models:Gr,genericSubTreeModel:zr}};var Kr=Wr.map(e=>`btcpp-v${e}`),wt=["btcpp-v4",...Kr],Hr=`btcpp-v${eo}`;function Jr(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 pd(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Jr)}))}function Yr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Jr)}}function md(){let e={};for(let[t,n]of Object.entries(Et))e[`btcpp-v${t}`]=pd(n.models);return e}function fd(){let e={};for(let[t,n]of Object.entries(Et))e[`btcpp-v${t}`]=Yr(n.genericSubTreeModel);return e}var gd=md(),yd=fd();function hd(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Et,t)}function Zr(e){return e==="btcpp-v4"?Hr:e}function bd(e){return e==="btcpp-v4"?eo:e.replace(/^btcpp-v/,"")}function Qr(e){if(e&&e!=="btcpp-v4"&&!hd(e))throw new Error(`unsupported builtin model set: ${e}`)}function to(e="btcpp-v4"){Qr(e);let t=Zr(e);return gd[t].map(o=>ei(o))}function no(e="btcpp-v4"){Qr(e);let t=yd[Zr(e)]??Yr(Et[bd(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function ei(e){return{id:e.id,kind:e.kind,source:"builtin",sourceMeta:{sourceKind:"builtin"},editable:!1,ports:(e.ports??[]).map(t=>({...t,enum:t.enum?[...t.enum]:void 0}))}}function Nt(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let o=t.name.localeCompare(n.name);if(o!==0)return o;let r=t.direction.localeCompare(n.direction);if(r!==0)return r;let i=(t.type??"").localeCompare(n.type??"");if(i!==0)return i;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function lt(e,t){let n=Nt(e),o=Nt(t);return JSON.stringify(n)===JSON.stringify(o)}function oo(e,t){if(lt(e,t))return"none";let n=Nt(e),o=Nt(t);if(n.kind!==o.kind)return"kind";if(n.ports.length!==o.ports.length)return"ports";let r=new Map(o.ports.map(a=>[a.name,a])),i=!1,s=!1;for(let a of n.ports){let l=r.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&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as Td,parse as Dd,parseTree as Cd}from"jsonc-parser";import{z as w}from"zod";var ti=w.discriminatedUnion("kind",[w.object({kind:w.literal("pattern"),pattern:w.string()}).strict(),w.object({kind:w.literal("enum"),values:w.array(w.string())}).strict(),w.object({kind:w.literal("tuple"),separator:w.string(),items:w.array(w.string())}).strict(),w.object({kind:w.literal("json-schema"),schema:w.unknown()}).strict()]),vd=w.object({kind:w.enum(["primitive","opaque","any"]),canonical:w.string().optional(),aliases:w.array(w.string()).optional(),compatibleWith:w.array(w.string()).optional(),validate:ti.optional()}).strict(),Sd=w.object({from:w.string().optional(),to:w.string()}).strict(),xd=w.object({typeRefinement:Sd.optional(),validate:ti.optional(),required:w.boolean().optional(),enum:w.array(w.string()).optional(),description:w.string().optional()}).strict(),kd=w.object({ports:w.record(w.string(),xd).optional()}).strict(),Rd=w.object({enums:w.record(w.string(),w.number().finite()).optional()}).strict(),ni=w.object({version:w.literal(1),types:w.record(w.string(),vd).optional(),augment:w.record(w.string(),kd).optional(),script:Rd.optional()}).strict();function Id(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
5
|
-
`&&t.push(n+1);return n=>{let o=0,r=t.length-1;for(;o<=r;){let s=Math.floor((o+r)/2);t[s]<=n?o=s+1:r=s-1}let i=Math.max(0,o-1);return{line:i,character:n-t[i],offset:n}}}function Ed(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function oi(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function wd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...oi(e.path),t]}return oi(e.path)}function Nd(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 ro(e,t){let n=t?.uri??"",o=[],r=Cd(e,o,{allowTrailingComma:!0,disallowComments:!1});try{let i=Dd(e,o,{allowTrailingComma:!0,disallowComments:!1});if(o.length>0||!r)throw new Error(`JSON parse error at offset ${o[0]?.offset??0}`);let s=ni.safeParse(i);if(!s.success){let a=Id(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let d=wd(l),{message:c,path:p}=Nd(l);return{kind:"schema",message:c,path:p,range:Ed(Td(r,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(i){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(i.message||i)]}]}}}import{z as q}from"zod";var ri=q.object({direction:q.enum(["input","output","inout"]).optional(),type:q.string().optional(),required:q.boolean().optional(),default:q.string().optional(),description:q.string().optional(),enum:q.array(q.string()).optional()}).strict(),sn=q.object({kind:q.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:q.record(q.string(),ri).optional(),description:q.string().optional()}).strict(),io=q.object({nodes:q.record(q.string(),sn)}).strict();import{z as k}from"zod";var ii=k.enum(["off","info","warn","error"]),si=k.union([ii,k.tuple([ii,k.record(k.string(),k.unknown())])]),Pd=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(),Md=k.string(),Bd=k.object({name:k.string(),attribute:k.string(),base:k.enum(["file","project-root"]).optional()}).strict(),_d=k.object({elements:k.array(Bd).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(),Ad=k.object({entrypoints:k.array(Md).optional(),includes:_d.optional(),behaviorTreeIds:k.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),jd=k.object({builtins:k.array(k.enum(wt)).optional(),files:k.array(k.string()).optional(),augmentations:k.array(k.string()).optional(),definitions:k.array(k.string()).optional(),inline:k.record(k.string(),sn).optional()}).strict(),ai=k.object({inline:k.enum(["allow","deny"]).optional()}).strict(),Fd=k.object({enabled:k.boolean().optional(),rules:k.record(k.string(),si).optional(),baseline:k.string().optional(),suppressions:ai.optional()}).strict(),Ld=k.object({rules:k.record(k.string(),si).optional(),suppressions:ai.optional()}).strict(),li=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(),Od=k.object({files:k.array(k.string()),linter:Ld.optional(),formatter:li.optional()}).strict(),di=k.object({$schema:k.string().optional(),strict:k.boolean().optional(),files:Pd.optional(),resolver:Ad.optional(),models:jd.optional(),linter:Fd.optional(),formatter:li.optional(),overrides:k.array(Od).optional()}).strict();function pi(e){return e.flatMap($d)}function $d(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(r=>{let i=ci([...e.path,String(r)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=ci(e.path);return mi(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 ci(e){return e.map(String).join(".")||void 0}function mi(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(ui);let o=e.unionErrors;return Array.isArray(o)?o.flatMap(r=>r.issues??[]).some(ui):!1}function ui(e){return typeof e=="object"&&e!==null&&mi(e)}function dt(e){let t=di.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:pi(t.error.issues)}}function Ud(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 Vd(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 qd(e){return e.map(t=>E(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function Xd(e){let t=[],n=Kn(),{$schema:o,strict:r,overrides:i,...s}=e;r&&(n=kt(n,Nr)),n=kt(n,s),n.overrides=(i??[]).map(l=>({files:l.files,linter:Vd(l.linter),formatter:Ud(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function an(e){let t=dt(e);return t.ok?Xd(t.value):{ok:!1,config:Kn(),diagnostics:qd(t.diagnostics)}}var Gd="https://unpkg.com/@abco20/btxml-checker/schemas/btxml.config.schema.json";function ln(){return{$schema:Gd}}function zd(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 Wd(e,t){let n=e.replace(/\\/g,"/"),o=t.startsWith("!"),r=o?t.slice(1):t,s=zd(r).test(n);return o?!s:s}function fi(e,t){return e.overrides.filter(n=>n.files.some(o=>Wd(t,o)))}function Kd(e){return e.replaceAll("\\","/")}function ee(e,t){let n=Kd(t),o=fi(e,n),r=e;for(let i of o)r=kt(r,{linter:i.linter,formatter:i.formatter});return{files:r.files,resolver:r.resolver,models:r.models,linter:r.linter,formatter:r.formatter}}function ye(e){let t=e.linter.rules["model/no-unknown-port"];return Array.isArray(t)&&t.length>=2&&t[1].subTreePorts==="strict"?{unknownSubTreePorts:"reject"}:{unknownSubTreePorts:"allow"}}function so(e){return e in z}function ao(e){for(let[t,n]of Object.entries(z)){let o=n;if(o.code===e||o.codes?.includes(e))return t}}function we(e){if(typeof e=="string")return tn.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&tn.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 Pt(e,t){let n=e[t];if(n!==void 0){let o=we(n);if(o)return o.severity}return z[t].defaultSeverity}function lo(e,t){let n=[],r=z[e].optionsSchema;if(!r)return n;let i=r.safeParse(t);if(i.success)return n;for(let s of i.error.issues)n.push(...Jd(e,s));return n}function Jd(e,t){if(t.code==="unrecognized_keys")return t.keys.map(o=>E("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(o)}\` for rule \`${e}\``,void 0,void 0,{help:gi(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[E("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:gi(e)})]}function gi(e){let n=z[e].options?.map(o=>o.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function co(e){let t=[];yi(e.linter,"linter.rules",t);for(let[n,o]of(e.overrides??[]).entries())yi(o.linter,`overrides.${n}.linter.rules`,t);return t}function yi(e,t,n){for(let[o,r]of Object.entries(e?.rules??{})){let i=`${t}.${o}`;if(!so(o)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:i,message:`unknown lint rule \`${o}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=we(r);if(s?.options)for(let a of lo(o,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:Yd(i,s.options,a.message),message:a.message,help:a.details?.help})}}function Yd(e,t,n){let o=Object.keys(t).find(r=>n.includes(`\`${r}\``));return o?`${e}.1.${o}`:`${e}.1`}var j=(e,t,n,o=!0)=>({code:e,title:t,description:n,suppressible:o}),Zd={[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.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 _m}from"yargs/helpers";import Am 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"},ed=Object.values(u).sort();var td=sn.object({subTreePorts:sn.enum(["loose","strict"]).optional()}).strict(),nd=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:td,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:nd,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 Oi={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"}}},od={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 eo(){return structuredClone(od)}function Tt(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 lt(e,t,n){return{line:e,character:t,offset:n}}function I(e,t){return{start:e,end:t}}function It(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 id=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function to(e){return{ok:!0,reference:e}}function Be(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Ui(e){return id.test(e)}function $i(e){if(!e)return Be("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Ui(t)?{ok:!0,scope:"global",key:t}:Be("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):Be("empty-key",e,"Global blackboard reference key must not be empty")}return Ui(e)?{ok:!0,scope:"local",key:e}:Be("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function Z(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return to({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return Be("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return Be("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let o=n.slice(1,-1).trim(),i=$i(o);return i.ok?to({scope:i.scope,key:i.key,raw:n,syntax:"braced"}):i}function ln(e){let{rawName:t}=e;if(!t.startsWith("@"))return Be("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=$i(t);return n.ok?n.scope!=="global"?Be("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):to({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 rd={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function sd(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 ad(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function ld(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function dd(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function qi(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 cd(e,t,n){let o=qi(e,t),i=qi(o,n);return{start:o,end:i}}function Vi(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=Z({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:Ee(c.reference),syntax:c.reference.syntax,attributeName:i.name,element:e,uri:n,range:cd(r.start,s.slice(0,d.parsedOffset),c.reference.raw.slice(0,p))})},l=Z({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"&&Vi(i,t,n,o)}function ud(e,t,n,o){let i=[];for(let r of e.children||[]){if(r.kind!=="element"||!ad(r.name))continue;let s=se(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=se(l,"name"),c=se(l,"type"),p=se(l,"default")||se(l,"default_value"),m=se(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 pd(e,t){let n=[];for(let o of e.children||[]){if(o.kind!=="element"||o.name!=="BehaviorTree")continue;let i=se(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 md(e,t){let n=[],o=(i,r,s=!1)=>{if(s)return;let a=i.name==="BehaviorTree"?se(i,"ID")?.value??r:r,l=i.name==="TreeNodesModel";if(i.name==="SubTree"){let d=se(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 fd(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Xi(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 gd(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Xi),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 yd(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function hd(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function bd(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 vd(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(fd),subtreeReferences:e.subtreeReferences.map(yd),nodeUsages:e.nodeUsages.map(hd),blackboardReferences:e.blackboardReferences.map(bd),treeNodesModel:e.treeNodesModel.map(gd),genericSubTreePorts:e.genericSubTreePorts.map(Xi),rootMainTreeToExecute:ld(e.rootMainTreeToExecute)}}function Sd(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"?se(i,"ID")?.value??r:r,d=l!==void 0;if(i.name==="SubTree"){let c=se(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 xd(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function kd(e){return T(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 Rd(e,t){let n=[],o=t?.uri||e.uri,i=e.root,r=e.isBtXml,s=sd(e),a=dd(e),l=((t?.path??e.path)||o==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",d=i&&e.kind!=="model-document"?pd(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=ud(x,o,a,l),M=new Map;for(let P of D)xd({node:P,treeNodesModel:c,genericSubTreePorts:p})||(M.has(P.id)?n.push(kd(P)):M.set(P.id,P))}let f=i?md(i,o):[],y=i?Sd(i,o):[],g=i?(()=>{let x=[];return Vi(i,x,o,e.originalText),x})():[],S=i?se(i,"main_tree_to_execute"):void 0;return{extracted:{publicModel:vd({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 Gi(e,t){let{extracted:n,diagnostics:o}=Rd(e,t);return{model:n.publicModel,diagnostics:o}}function no(e,t){return Gi(e,t)}var zi=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Dd=new Set([...zi,"_autoremap","_description","__shared_blackboard"]),Td=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 oo(e){return zi.has(e)}function Wi(e){return Dd.has(e)}function io(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(Wi(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=Td.get(t);if(o)return o}}function Ki(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 Ct(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,o])=>Ki(n,o))}}var Id=[{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"]}],Et=new Map,Hi=new Map;for(let e of Id){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Hi.set(e.name,t),Et.set(e.name,e.name);for(let n of e.aliases)Et.set(n,e.name)}function Cd(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 ro(e){return Et.get(e)??e}function Ed(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 Nt(e){return Et.get(e)}function dt(e=[]){let t=new Map,n=new Map(Et);for(let o of Hi.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=ro(r.canonical??i),l=t.get(s)??Cd(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)??ro(i))),o.compatibleWith.delete(o.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([o,i])=>[o,Ed(i)])),namesToCanonical:n}}function fe(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??ro(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 Mt(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 Ji=[{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:[]}],Yi={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 Zi=[{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:[]}],Qi={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 er=[{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:[]}],tr={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 nr=["4.6.2","4.8.2","4.9.0"],so="4.9.0",wt={"4.6.2":{models:Ji,genericSubTreeModel:Yi},"4.8.2":{models:Zi,genericSubTreeModel:Qi},"4.9.0":{models:er,genericSubTreeModel:tr}};var or=nr.map(e=>`btcpp-v${e}`),Pt=["btcpp-v4",...or],ir=`btcpp-v${so}`;function rr(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 Nd(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(rr)}))}function sr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(rr)}}function Md(){let e={};for(let[t,n]of Object.entries(wt))e[`btcpp-v${t}`]=Nd(n.models);return e}function wd(){let e={};for(let[t,n]of Object.entries(wt))e[`btcpp-v${t}`]=sr(n.genericSubTreeModel);return e}var Pd=Md(),Bd=wd();function _d(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(wt,t)}function ar(e){return e==="btcpp-v4"?ir:e}function Ad(e){return e==="btcpp-v4"?so:e.replace(/^btcpp-v/,"")}function lr(e){if(e&&e!=="btcpp-v4"&&!_d(e))throw new Error(`unsupported builtin model set: ${e}`)}function ao(e="btcpp-v4"){lr(e);let t=ar(e);return Pd[t].map(o=>dr(o))}function lo(e="btcpp-v4"){lr(e);let t=Bd[ar(e)]??sr(wt[Ad(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function dr(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 Bt(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 ct(e,t){let n=Bt(e),o=Bt(t);return JSON.stringify(n)===JSON.stringify(o)}function co(e,t){if(ct(e,t))return"none";let n=Bt(e),o=Bt(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 $d,parse as qd,parseTree as Vd}from"jsonc-parser";import{z as N}from"zod";var cr=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()]),jd=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:cr.optional()}).strict(),Fd=N.object({from:N.string().optional(),to:N.string()}).strict(),Ld=N.object({typeRefinement:Fd.optional(),validate:cr.optional(),required:N.boolean().optional(),enum:N.array(N.string()).optional(),description:N.string().optional()}).strict(),Od=N.object({ports:N.record(N.string(),Ld).optional()}).strict(),Ud=N.object({enums:N.record(N.string(),N.number().finite()).optional()}).strict(),ur=N.object({version:N.literal(1),types:N.record(N.string(),jd).optional(),augment:N.record(N.string(),Od).optional(),script:Ud.optional()}).strict();function Xd(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 Gd(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function pr(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function zd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...pr(e.path),t]}return pr(e.path)}function Wd(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 uo(e,t){let n=t?.uri??"",o=[],i=Vd(e,o,{allowTrailingComma:!0,disallowComments:!1});try{let r=qd(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=ur.safeParse(r);if(!s.success){let a=Xd(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let d=zd(l),{message:c,path:p}=Wd(l);return{kind:"schema",message:c,path:p,range:Gd($d(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 mr=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(),mr).optional(),description:X.string().optional()}).strict(),po=X.object({nodes:X.record(X.string(),un)}).strict();import{z as k}from"zod";var fr=k.enum(["off","info","warn","error"]),gr=k.union([fr,k.tuple([fr,k.record(k.string(),k.unknown())])]),Kd=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(),Hd=k.string(),Jd=k.object({name:k.string(),attribute:k.string(),base:k.enum(["file","project-root"]).optional()}).strict(),Yd=k.object({elements:k.array(Jd).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(),Zd=k.object({entrypoints:k.array(Hd).optional(),includes:Yd.optional(),behaviorTreeIds:k.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),Qd=k.enum(["allow-unused","used-only","single-source"]),ec=k.object({builtins:k.array(k.enum(Pt)).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:Qd.optional()}).strict(),yr=k.object({inline:k.enum(["allow","deny"]).optional()}).strict(),tc=k.object({enabled:k.boolean().optional(),rules:k.record(k.string(),gr).optional(),baseline:k.string().optional(),suppressions:yr.optional()}).strict(),nc=k.object({rules:k.record(k.string(),gr).optional(),suppressions:yr.optional()}).strict(),hr=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(),oc=k.object({files:k.array(k.string()),linter:nc.optional(),formatter:hr.optional()}).strict(),br=k.object({$schema:k.string().optional(),strict:k.boolean().optional(),files:Kd.optional(),resolver:Zd.optional(),models:ec.optional(),linter:tc.optional(),formatter:hr.optional(),overrides:k.array(oc).optional()}).strict();function xr(e){return e.flatMap(ic)}function ic(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let r=vr([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:r,message:`unknown config field \`${r}\``}});let n=vr(e.path);return kr(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 vr(e){return e.map(String).join(".")||void 0}function kr(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(Sr);let o=e.unionErrors;return Array.isArray(o)?o.flatMap(i=>i.issues??[]).some(Sr):!1}function Sr(e){return typeof e=="object"&&e!==null&&kr(e)}function ut(e){let t=br.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:xr(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 sc(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 ac(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 lc(e){let t=[],n=eo(),{$schema:o,strict:i,overrides:r,...s}=e;i&&(n=Tt(n,Oi)),n=Tt(n,s),n.overrides=(r??[]).map(l=>({files:l.files,linter:sc(l.linter),formatter:rc(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function pn(e){let t=ut(e);return t.ok?lc(t.value):{ok:!1,config:eo(),diagnostics:ac(t.diagnostics)}}var dc="https://unpkg.com/@abco20/btxml-checker/schemas/btxml.config.schema.json";function mn(){return{$schema:dc}}function cc(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 uc(e,t){let n=e.replace(/\\/g,"/"),o=t.startsWith("!"),i=o?t.slice(1):t,s=cc(i).test(n);return o?!s:s}function Rr(e,t){return e.overrides.filter(n=>n.files.some(o=>uc(t,o)))}function pc(e){return e.replaceAll("\\","/")}function Q(e,t){let n=pc(t),o=Rr(e,n),i=e;for(let r of o)i=Tt(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 mo(e){return e in W}function fo(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 We(e,t){let n=e[t];if(n!==void 0){let o=Ne(n);if(o)return o.severity}return W[t].defaultSeverity}function go(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(...fc(e,s));return n}function fc(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:Dr(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:Dr(e)})]}function Dr(e){let n=W[e].options?.map(o=>o.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function yo(e){let t=[];Tr(e.linter,"linter.rules",t);for(let[n,o]of(e.overrides??[]).entries())Tr(o.linter,`overrides.${n}.linter.rules`,t);return t}function Tr(e,t,n){for(let[o,i]of Object.entries(e?.rules??{})){let r=`${t}.${o}`;if(!mo(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 go(o,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:gc(r,s.options,a.message),message:a.message,help:a.details?.help})}}function gc(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}),yc={[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"/>
|
|
6
7
|
<!-- file2.xml --><BehaviorTree ID="shared"/>`,validExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
7
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]:j(u.IncludeCycle,"Include cycle","Include graph cycles are not allowed.",!1),[u.UnresolvedIncludePathVariable]:j(u.UnresolvedIncludePathVariable,"Unresolved include path variable","Include path variables must resolve before lookup.",!1),[u.IncludeOutsideWorkspace]:j(u.IncludeOutsideWorkspace,"Include outside workspace","Includes must stay within the workspace root.",!1),[u.ExternalIncludeUsed]:j(u.ExternalIncludeUsed,"External include used","An include file outside the workspace root was used.",!1),[u.IncludeDepthExceeded]:j(u.IncludeDepthExceeded,"Include depth exceeded","The maximum depth of nested includes was reached.",!1),[u.TooManyResolvedFiles]:j(u.TooManyResolvedFiles,"Too many resolved files","The maximum number of allowed files included was reached.",!1),[u.EntrypointNotFound]:j(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]:j(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 write to a blackboard remap.",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>
|
|
8
9
|
<AlwaysSuccess/>
|
|
9
|
-
</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)},Qd=Object.fromEntries(Object.values(z).flatMap(e=>{let t=e;return[t.code,...(t.codes??[]).filter(n=>n!==t.code)].map(n=>[n,t.defaultSeverity])})),ec={[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 tc(e){let t=Qd[e]??ec[e];if(!t)throw new Error(`Missing default severity metadata for ${e}`);return t}var dn={};for(let[e,t]of Object.entries(Zd))dn[e]={...t,defaultSeverity:tc(e)};var hi={};for(let[e,t]of Object.entries(z)){let n=dn[t.code];if(n){let o=t;hi[e]=o.options?{...n,options:o.options}:n}}function cn(e){return dn[e]}function uo(){return[...Object.values(u)].sort()}function bi(e,t){if(t)return rn(e,t)}function vi(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Si(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return E(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function nc(e,t,n,o,r){let i=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:i,typeSource:n.typeSource??vi(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=bi(e,l.from),c=bi(e,i);return d&&d!==c?(r.push(Si({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${i??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:i,actualFrom:l.from,to:l.to},notes:i||l.from?[`base type: ${i??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function oc(e,t,n,o){let r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of Object.entries(n.ports??{})){let a=r.get(i);if(!a){o.push(Si({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${i}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:i}}));continue}r.set(i,nc(e,t,a,s,o))}return{...t,ports:t.ports.map(i=>r.get(i.name)??i)}}function rc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??vi(e)}}function xi(e,t,n){let o=[],r=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(rc)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let l=r.get(s);if(!l){o.push(E("BT117_AUGMENT_TARGET_NOT_FOUND",h.Error,`augmentation target node \`${s}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:i.path?[`augmentation file: ${i.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:i.path}));continue}r.set(s,oc(t,l,a,o))}return{modelsById:r,diagnostics:o}}function Ti(e){return Mt("builtin",0,!1,e)}function Di(e){return Mt("xml-tree-nodes-model",10,!0,e)}function Ci(e){return Mt("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Ii(e){return Mt("node-definition-file",20,!0,e)}function Ei(e){return Mt("config-inline",30,!0,e)}function Mt(e,t,n,o){return{kind:e,precedence:t,editable:n,models:o.map(r=>wi(r,e,n&&r.editable!==!1))}}function ic(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function wi(e,t,n){let o=ic(t);return{...e,source:o,sourceMeta:e.sourceMeta??{sourceKind:o,file:e.uri,range:e.range},editable:n,ports:e.ports.map(r=>({...r,source:o}))}}function ct(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 ki(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 sc(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(i=>[i.name,i])),r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of o)r.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:ki(s)});for(let[i,s]of r)o.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:ki(s)});for(let[i,s]of o){let a=r.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function Ri(e,t){let n=new Map;for(let o of e){let r=n.get(o.id);if(!r){n.set(o.id,o);continue}if(lt(r,o))continue;let i=oo(r,o),s=sc(r,o),a;if(i==="port-default"){let l=new Map(r.ports.map(m=>[m.name,m])),d=o.ports.find(m=>{let g=l.get(m.name);return g&&g.defaultValue!==m.defaultValue}),c=d?.name??"unknown",p=[ct(r,0),ct(o,1)];a={kind:"port-default-conflict",nodeId:o.id,portName:c,sources:[{source:ct(r,0),value:l.get(c)?.defaultValue},{source:ct(o,1),value:d?.defaultValue}]},t.push({id:o.id,definitions:[r,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:r.uri&&r.range?[{uri:r.uri,range:r.range,message:"previous definition"}]:void 0})}else{let l=[ct(r,0),ct(o,1)];a={kind:"node-model-conflict",nodeId:o.id,sources:l,differences:s},t.push({id:o.id,definitions:[r,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:r.uri&&r.range?[{uri:r.uri,range:r.range,message:"previous definition"}]:void 0})}}return n}function ac(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 Ni(e){let t=[],n=new Map,o=new Map,r=[...e].sort((a,l)=>a.precedence-l.precedence),i=new Map,s=new Map;for(let a of r){let l=i.get(a.precedence)??[],d=a.models.map(c=>wi(c,a.kind,a.editable&&c.editable!==!1));l.push(...d),i.set(a.precedence,l);for(let c of d)s.set(c.id,a.precedence)}for(let[a,l]of[...i.entries()].sort((d,c)=>d[0]-c[0])){let d=l.filter(g=>s.get(g.id)===a),c=l.filter(g=>s.get(g.id)!==a),p=Ri(c,[]);for(let[g,y]of Ri(d,t))p.set(g,y);let m=new Set(l.map(g=>g.id));for(let g of m)s.get(g)===a&&n.set(g,l.filter(y=>y.id===g));for(let[g,y]of p)o.set(g,ac(o.get(g),y))}return{nodeModelsById:n,mergedNodeModelsById:o,conflicts:t}}function lc(e){return wt.includes(e)}function dc(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:at(),augmentations:[]}}function cc(e,t,n){let o=e.get(t)||[];o.push(n),e.set(t,o)}function uc(e,t,n){for(let o of new Set(n))if(lc(o)){for(let r of to(o))e.builtins.set(r.id,r),t.push(r);e.genericSubTreePorts.push(...no(o))}}function pc(e,t,n,o,r){for(let i of r){let s=Jn(i,{uri:i.uri,path:i.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(i.uri,a);for(let l of a.behaviorTrees)cc(e.behaviorTreesById,l.id,l);i.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 fc(e){let t=new Set,n=[];for(let o of e.genericSubTreePorts){let r=mc(o);t.has(r)||(t.add(r),n.push(o))}e.genericSubTreePorts=n}function gc(e,t,n,o,r){e.modelLayers.push(Ti(t),Di(n),Ci(o)),r.models?.length&&e.modelLayers.push(Ii([...r.models])),e.modelLayers.push(...r.additionalModelLayers??[])}function Bt(e,t){return yc(e,t)}function yc(e,t){let n=dc(),o=[],r=[],i=[],s=[];uc(n,r,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=at(t.augmentations??[]),pc(n,o,i,s,e),fc(n),gc(n,r,i,s,t);let a=t.config.models.inline;if(a){let c=[];for(let[p,m]of Object.entries(a))c.push(Tt(p,m));n.modelLayers.push(Ei(c))}let l=Ni(n.modelLayers),d=xi(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 Pi={unknownSubTreePorts:"allow"};function Mi(e){return{...Pi,...e}}var hc=["Action","Condition","Control","Decorator"],bc=new Set(hc);var vc=new Set(["input_port","output_port","inout_port"]);function mo(e){return bc.has(e)}function un(e,t){return e.attributes.find(n=>n.name===t)?.value}function po(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&po(n,t))return!0;return!1}function Bi(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return po(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&po(n,t))return!0;return!1}function pn(e){return vc.has(e.name)}function _i(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":mo(e.name)?"generic-node":pn(e)?"unknown-xml":"concrete-node"}function fo(e){if(e.name==="SubTree")return un(e,"ID")||"SubTree";if(mo(e.name))return un(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||pn(e)))return e.name}function pe(e){return e.typeRegistry}function he(e,t){return ue(pe(e),t)}function ut(e,t,n){return It(pe(e),t,n)}function _t(e,t){return e.documents.get(t)}function be(e,t){return e.behaviorTreesById.get(t)??[]}function go(e,t){return e.behaviorTreesById.has(t)}function pt(e){return[...e.behaviorTreesById.keys()]}function At(e){return[...e.documents.values()]}function Be(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function jt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(o=>o.id===t))}function yo(e){return e.modelLayers.flatMap(t=>t.models)}function ho(e){return[...e.mergedNodeModelsById.values()]}function bo(e){return[...e.nodeModelsById.keys()]}function vo(e){return[...e.genericSubTreePorts]}function So(e){return[...e.augmentations]}function Ft(e){return e.modelConflicts}function Lt(e,t){let{id:n,fileLocalUri:o,config:r}=t,i=be(e,n);if(i.length>0){if((r?.resolver?.behaviorTreeIds==="file-local-first"||r?.resolver?.behaviorTreeIds==="allow-ambiguous")&&o){let d=i.filter(c=>c.uri===o);d.length>0&&(i=d)}let a=Be(e,n),l=a?.kind==="SubTree"?[a]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(d=>d.id),...l.map(d=>d.id)],behaviorTrees:i,definitions:l}}let s=Be(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function xo(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Be(e,t);if(n){let r=Ft(e).find(i=>i.id===t&&i.code==="BT012_CONFLICTING_NODE_MODEL");return r?{status:"ambiguous",nodeType:t,candidates:r.definitions}:{status:"resolved",model:n}}let o=jt(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 ko(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Ro(e){let t=vo(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return ko([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function To(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}:Yn(t.name)?{status:"reserved-attribute",attribute:t,name:t.name,value:t.value}:e.allowsArbitraryAttributes?{status:"allowed-arbitrary",attribute:t,name:t.name,value:t.value}:e.unknownModelPortStatus==="undeclared"?{status:"undeclared",attribute:t,name:t.name,value:t.value}:e.model.status==="unresolved"||e.model.status==="ambiguous"?{status:"unknown-node-model",attribute:t,name:t.name,value:t.value}:{status:"undeclared",attribute:t,name:t.name,value:t.value}}function _e(e,t){let n=Mi(t.policy),o=t.element,r=_i(o),i=Bi(t.documentRoot,o);if((t.isModelDefinition||i&&(r==="generic-node"||r==="subtree"))&&(r="model-definition"),i&&pn(o)&&(r="unknown-xml"),r==="root"||r==="behavior-tree"||r==="tree-nodes-model"||r==="include"||r==="model-definition"||r==="unknown-xml")return{element:o,tagName:o.name,tagForm:r,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=fo(o);if(r!=="subtree"){let g=xo(e,s),y=Ro({index:e,tagForm:r,model:g}),f=o.attributes.map(x=>To({attribute:x,ports:y,allowsArbitraryAttributes:!1,model:g}));return{element:o,tagName:o.name,tagForm:r,nodeType:s,model:g,ports:y,allowsArbitraryAttributes:!1,portUsages:f}}let a=un(o,"ID"),l=a?Lt(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 g=xo(e,l.treeId);g.status==="resolved"&&g.model.kind==="SubTree"?d=g: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=Ro({index:e,tagForm:r,model:d,subtreeModelPorts:l.status==="ambiguous"?ko(l.definitions.flatMap(g=>g.ports)):void 0}),m=o.attributes.map(g=>To({attribute:g,ports:p,allowsArbitraryAttributes:c,model:d,unknownModelPortStatus:!c&&d.status!=="resolved"?"undeclared":void 0}));return{element:o,tagName:o.name,tagForm:r,nodeType:s,model:d,subtree:{id:a,target:l},ports:p,allowsArbitraryAttributes:c,portUsages:m}}function mn(e,t){return _e(e,t).portUsages.find(o=>o.name===t.attributeName)}function kc(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Rc(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Ai(e,t){let n=e.line,o=e.character,r=e.offset;for(let i of t){if(r+=i.length,i===`
|
|
10
|
-
`){n+=1,o=0;continue}o+=
|
|
11
|
-
`?(n++,o=0):o++;return
|
|
12
|
-
`||e==="\r"}function
|
|
13
|
-
`&&e!=="\r"}function
|
|
14
|
-
`?(s+=1,a=0):a+=1}function y(){for(;!p()&&_c(m());)g()}let f=(v,D,M,B,R,W)=>{n.push(E(v,D,M,C(B,R),r.uri,W))};function x(v,D,M,B,R,W){n.push(E(v,D,M,B&&R?C(B,R):void 0,r.uri,W))}function b(){if(!Mc(m()))return"";let v=i;for(g();!p()&&Bc(m());)g();return e.slice(v,i)}function S(){let v=m();if(v!=='"'&&v!=="'")return{value:"",ok:!1};let D=c();g();let M=c(),B=i;for(;!p()&&m()!==v&&m()!=="<";)g();let R=c();if(p()||m()!==v)return{value:e.slice(B,i),ok:!1,valueRange:C(D,R),valueContentRange:C(M,R)};let W=e.slice(B,i);g(),Io(W,M.offset,e,f);let Ie=Oi(W);return{value:Ie.value,valueOffsets:Ie.offsets,ok:!0,valueRange:C(D,c()),valueContentRange:C(M,R)}}function T(){let v=[],D=new Set;for(;;){y();let M=m();if(!M||M===">"||M==="/"&&m(1)===">")break;let B=c(),R=b(),W=c();if(!R)break;y();let Ie=c();if(m()!=="="){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",B,W,{primaryLabel:`expected \`=\` after attribute \`${R}\``,help:`write the attribute as \`${R}="..."\``}),d=!0,o)continue;break}g();let Ll=c();y();let Wn=c(),ze=S(),it=c();if(!ze.ok&&(f("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",Wn,it,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${R}="value"\``}),d=!0,!o)||(D.has(R)?f("XML004_DUPLICATE_ATTRIBUTE",h.Error,`duplicate attribute \`${R}\``,B,it,{primaryLabel:`attribute \`${R}\` is already defined on this element`,help:`remove one of the duplicate \`${R}\` attributes`}):D.add(R),v.push({name:R,value:ze.value,...ze.valueOffsets?{valueOffsets:ze.valueOffsets}:{},range:C(B,it),fullRange:C(B,it),nameRange:C(B,W),equalsRange:C(Ie,Ll),valueRange:ze.valueRange||C(Wn,it),valueContentRange:ze.valueContentRange||C(Wn,it)}),!ze.ok&&o))break}return v}function N(v){l.length>0?l[l.length-1].children.push(v):(r.nodes.push(v),!r.root&&v.kind==="element"&&(r.root=v))}function A(){let v=c(),D=i;for(;!p()&&m()!=="<";)g();let M=e.slice(D,i);if(M.length===0)return;for(let R of M)if(Ac(R)){f("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",v,c(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}Io(M,D,e,f);let B={kind:"text",text:Ot(M),range:C(v,c()),fullRange:C(v,c())};N(B)}function _(){let v=c();g(4);let D=c(),M=i;for(;!p()&&!(m()==="-"&&m(1)==="-"&&m(2)===">");)g();let B=e.slice(M,i);if(p()){if(f("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",v,c(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),d=!0,!o)return;let Ie={kind:"comment",text:B,range:C(v,c()),fullRange:C(v,c()),contentRange:C(D,c())};N(Ie);return}(B.includes("--")||B.endsWith("-"))&&f("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",D,c(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let R=c();g(3);let W={kind:"comment",text:B,range:C(v,c()),fullRange:C(v,c()),contentRange:C(D,R)};N(W)}function P(){let v=c();g(5),y();let D=T();y(),m()==="?"&&m(1)===">"?g(2):f("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",v,c(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let M={range:C(v,c()),attributes:D};for(let B of D)B.name==="version"&&(M.version=B.value),B.name==="encoding"&&(M.encoding=B.value),B.name==="standalone"&&(M.standalone=B.value);r.xmlDeclaration=M}function Ce(){let v=c();g(2),y();let D=c(),M=b(),B=c();if(y(),m()!==">")for(f("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",v,c(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),d=!0;!p()&&m()!==">";)g();m()===">"&&g();let R=l.pop();if(!R||R.name!==M){let W=R?R.name:M||"",Ie=M||"";f("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Ie}>\``,v,c(),{primaryLabel:`opened as \`<${W}>\` but closed as \`</${Ie}>\``,help:`change the closing tag to \`</${W}>\` or fix the nesting`});return}R.closeTagRange=C(v,c()),R.endTagRange=C(v,c()),R.nameRange||(R.nameRange=C(D,B)),R.range=C(R.range.start,c()),R.fullRange=C(R.range.start,c())}for(;!p();)if(m()==="<")if(m(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")P();else{let v=c();for(;!p()&&!(m()==="?"&&m(1)===">");)g();p()||g(2),f("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",v,c(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(m(1)==="!"&&m(2)==="-"&&m(3)==="-")_();else if(m(1)==="!"&&m(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let v=c();for(g(8);!p()&&!(m()==="]"&&m(1)==="]"&&m(2)===">");)g();p()||g(3),f("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",v,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(i+2,i+9)==="DOCTYPE"){let v=c();for(g(8);!p()&&m()!==">";)g();p()||g(1),f("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",v,c(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(m(1)==="/")Ce();else{let v=c();g();let D=c(),M=b(),B=c();if(!M){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,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){g();continue}break}let R={kind:"element",name:M,attributes:[],children:[],range:C(v,v),fullRange:C(v,v),openTagRange:C(v,v),startTagRange:C(v,v),nameRange:C(D,B),selfClosing:!1};if(R.attributes=T(),y(),m()==="/"&&m(1)===">"){g(2),R.selfClosing=!0,R.openTagRange=C(v,c()),R.startTagRange=R.openTagRange,R.range=C(v,c()),R.fullRange=C(v,c()),N(R);continue}if(m()!==">"){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,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=C(v,c()),R.startTagRange=R.openTagRange,R.range=C(v,c()),R.fullRange=C(v,c()),N(R);continue}break}g(),R.openTagRange=C(v,c()),R.startTagRange=R.openTagRange,R.range=C(v,c()),R.fullRange=C(v,c()),N(R),l.push(R)}else A();if(l.length>0){let v=l[l.length-1];if(f("XML006_MISSING_CLOSING_TAG",h.Error,`missing closing tag for \`<${v.name}>\``,v.openTagRange.start,v.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${v.name}>\` before the end of the file`}),d=!0,o)for(;l.length>0;){let D=l.pop();if(!D)break;D.range=C(D.range.start,c()),D.fullRange=C(D.range.start,c())}}let Z=r.nodes.filter(v=>v.kind==="element");Z.length===0?x("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):Z.length>1&&x("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 L=r.root,Ge=L?.name==="BehaviorTree"||L?.name==="TreeNodesModel"||L?.name==="root"&&(L.attributes.some(v=>v.name==="BTCPP_format"&&v.value==="4")||L.children.some(v=>v.kind==="element"&&(v.name==="BehaviorTree"||v.name==="TreeNodesModel")));if(L)for(let v of r.nodes)v!==L&&v.kind==="text"&&v.text.trim().length>0&&f("XML016_TEXT_OUTSIDE_ROOT",h.Error,"text outside root element",v.range.start,v.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!r.xmlDeclaration&&!Ge)x("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(r.xmlDeclaration?.encoding&&r.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let v=r.xmlDeclaration.encoding;f("XML009_INVALID_ENCODING",h.Warning,"XML encoding should be UTF-8",r.xmlDeclaration.range.start,r.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${v}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return L&&Co(L,v=>{f("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",$i(v.range.start),$i(v.range.end),{primaryLabel:"this element contains both text and child elements",help:"move the text into an attribute or split it into separate elements",notes:["text inside `<input_port>` and `<output_port>` remains allowed"]})}),Li({document:r,diagnostics:n,partial:d,options:t})}var $t={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Ui(e){if(!e)return $t;let t=typeof e.indentWidth=="number"?e.indentWidth:$t.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:$t.xmlDeclaration,o=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:$t.blankLineBetweenBehaviorTrees,r=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:$t.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:o,lineEnding:r}}function fn(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function gn(e){return fn(e).replace(/"/g,""")}function jc(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Fc(e,t,n){return`${" ".repeat(e*n)}${t}`}function mt(e,t,n,o){let r=" ".repeat(t*o),i=e.attributes||[];if(i.length===0)return[`${r}<${e.name}${n}`];if(i.length===1)return[`${r}<${e.name} ${i[0].name}="${gn(i[0].value)}"${n}`];let s=[`${r}<${e.name} ${i[0].name}="${gn(i[0].value)}"`],a=" ".repeat(r.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let d=i[l],c=l===i.length-1?n:"";s.push(`${a}${d.name}="${gn(d.value)}"${c}`)}return s}function yn(e,t,n,o){let r=" ".repeat(t*n);if(e.kind==="comment")return[`${r}<!--${e.text}-->`];if(e.kind==="text"){let c=e.text.trim();return c?[Fc(t,fn(c),n)]:[]}let i=jc(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=i.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}="${gn(e.attributes[0].value)}"`;return[`${r}<${e.name}${c}>${fn(a)}</${e.name}>`]}return mt(e,t,`>${fn(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return mt(e,t,"/>".slice(0),n);let c=mt(e,t,">",n);return c.push(`${r}</${e.name}>`),c}let d=mt(e,t,">",n);for(let c of e.children||[])c.kind==="text"&&c.text.trim()===""||d.push(...yn(c,t+1,n,o));return d.push(`${r}</${e.name}>`),d}function Lc(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Vi(e,t,n,o){let r=[],i=Lc(e);for(let s=0;s<i.length;s+=1){let a=i[s],l=i[s-1],d=i[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)&&r.length>0&&r[r.length-1]!==""&&r.push(""),a.kind==="element"?(r.push(...yn(a,1,t,o)),a.name==="TreeNodesModel"&&r.push("")):r.push(...yn(a,1,t,o))}return r}function ft(e,t={}){let n=je(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(f=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(f.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let r=n.document.root,i=Ui(t),s=i.indentWidth,a=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...mt(r,0,">",s)),a.push(...Vi(r.children||[],s,i.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${r.name}>`),n.diagnostics.some(f=>f.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let d=`
|
|
15
|
-
`;(
|
|
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)},hc=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])})),bc={[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 vc(e){let t=hc[e]??bc[e];if(!t)throw new Error(`Missing default severity metadata for ${e}`);return t}var fn={};for(let[e,t]of Object.entries(yc))fn[e]={...t,defaultSeverity:vc(e)};var Ir={};for(let[e,t]of Object.entries(W)){let n=fn[t.code];if(n){let o=t;Ir[e]=o.options?{...n,options:o.options}:n}}function gn(e){return fn[e]}function ho(){return[...Object.values(u)].sort()}function Cr(e,t){if(t)return cn(e,t)}function Er(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Nr(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 Sc(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??Er(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=Cr(e,l.from),c=Cr(e,r);return d&&d!==c?(i.push(Nr({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 xc(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(Nr({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,Sc(e,t,a,s,o))}return{...t,ports:t.ports.map(r=>i.get(r.name)??r)}}function kc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Er(e)}}function Mr(e,t,n){let o=[],i=new Map([...e.entries()].map(([r,s])=>[r,{...s,ports:s.ports.map(kc)}]));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,xc(t,l,a,o))}return{modelsById:i,diagnostics:o}}function Br(e){return _t("builtin",0,!1,e)}function _r(e){return _t("xml-tree-nodes-model",10,!0,e)}function Ar(e){return _t("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function jr(e){return _t("node-definition-file",20,!0,e)}function Fr(e){return _t("config-inline",30,!0,e)}function _t(e,t,n,o){return{kind:e,precedence:t,editable:n,models:o.map(i=>Lr(i,e,n&&i.editable!==!1))}}function Rc(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Lr(e,t,n){let o=Rc(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 pt(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 wr(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 Dc(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:wr(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:wr(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 Pr(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(ct(i,o))continue;let r=co(i,o),s=Dc(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=[pt(i,0),pt(o,1)];a={kind:"port-default-conflict",nodeId:o.id,portName:c,sources:[{source:pt(i,0),value:l.get(c)?.defaultValue},{source:pt(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=[pt(i,0),pt(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 Tc(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 Or(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=>Lr(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=Pr(c,[]);for(let[f,y]of Pr(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,Tc(o.get(f),y))}return{nodeModelsById:n,mergedNodeModelsById:o,conflicts:t}}function Ic(e){return Pt.includes(e)}function Cc(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:dt(),augmentations:[]}}function Ec(e,t,n){let o=e.get(t)||[];o.push(n),e.set(t,o)}function Nc(e,t,n){for(let o of new Set(n))if(Ic(o)){for(let i of ao(o))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...lo(o))}}function Mc(e,t,n,o,i){for(let r of i){let s=no(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)Ec(e.behaviorTreesById,l.id,l);r.kind==="model-document"?o.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function wc(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 Pc(e){let t=new Set,n=[];for(let o of e.genericSubTreePorts){let i=wc(o);t.has(i)||(t.add(i),n.push(o))}e.genericSubTreePorts=n}function Bc(e,t,n,o,i){e.modelLayers.push(Br(t),_r(n),Ar(o)),i.models?.length&&e.modelLayers.push(jr([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function At(e,t){return _c(e,t)}function _c(e,t){let n=Cc(),o=[],i=[],r=[],s=[];Nc(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=dt(t.augmentations??[]),Mc(n,o,r,s,e),Pc(n),Bc(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(Ct(p,m));n.modelLayers.push(Fr(c))}let l=Or(n.modelLayers),d=Mr(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 Ur={unknownSubTreePorts:"allow"};function $r(e){return{...Ur,...e}}var Ac=["Action","Condition","Control","Decorator"],jc=new Set(Ac);var Fc=new Set(["input_port","output_port","inout_port"]);function vo(e){return jc.has(e)}function yn(e,t){return e.attributes.find(n=>n.name===t)?.value}function bo(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&bo(n,t))return!0;return!1}function qr(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return bo(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&bo(n,t))return!0;return!1}function hn(e){return Fc.has(e.name)}function Vr(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":vo(e.name)?"generic-node":hn(e)?"unknown-xml":"concrete-node"}function So(e){if(e.name==="SubTree")return yn(e,"ID")||"SubTree";if(vo(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 mt(e,t,n){return Mt(ge(e),t,n)}function jt(e,t){return e.documents.get(t)}function Se(e,t){return e.behaviorTreesById.get(t)??[]}function xo(e,t){return e.behaviorTreesById.has(t)}function Xr(e){return gt(e).flatMap(t=>t.nodeUsages)}function ko(e){let t=new Map;for(let n of Xr(e)){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}function ft(e){return[...e.behaviorTreesById.keys()]}function gt(e){return[...e.documents.values()]}function _e(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Ft(e,t){return e.modelLayers.flatMap(n=>n.models.filter(o=>o.id===t))}function Ro(e){return e.modelLayers.flatMap(t=>t.models)}function Do(e){return[...e.mergedNodeModelsById.values()]}function To(e){return[...e.nodeModelsById.keys()]}function Io(e){return[...e.genericSubTreePorts]}function Co(e){return[...e.augmentations]}function Lt(e){return e.modelConflicts}function Ot(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=_e(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=_e(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Eo(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=_e(e,t);if(n){let i=Lt(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=Ft(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 No(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Mo(e){let t=Io(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return No([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function wo(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}:oo(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 Ae(e,t){let n=$r(t.policy),o=t.element,i=Vr(o),r=qr(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=So(o);if(i!=="subtree"){let f=Eo(e,s),y=Mo({index:e,tagForm:i,model:f}),g=o.attributes.map(S=>wo({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?Ot(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=Eo(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=Mo({index:e,tagForm:i,model:d,subtreeModelPorts:l.status==="ambiguous"?No(l.definitions.flatMap(f=>f.ports)):void 0}),m=o.attributes.map(f=>wo({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 Ae(e,t).portUsages.find(o=>o.name===t.attributeName)}function Uc(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function $c(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Gr(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 Po(e,t,n){let o=Gr(e,t),i=Gr(o,n);return{start:o,end:i}}function qc(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=Z({portName:t,rawValue:a});if(d.ok){r.push({raw:a,key:d.reference.key,scope:d.reference.scope,identity:Ee(d.reference),range:Po(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:Po(o.start,i.slice(0,l),a),syntax:"invalid"})}if(r.length===0){let s=Z({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:Ee(s.reference),range:Po(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 Vc(e,t){return Uc(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Wr(e){let t=[];for(let n of e)t.push(n),t.push(...Wr(n.children));return t}function Xc(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 Gc(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 zc(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=zc(e.root),i=$c(e).map(l=>({id:zr(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),r=[],s=[],a=(l,d,c,p)=>{let m=Ae(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:o.has(l)}),f=Xc(m),y={element:l,path:p,tagName:l.name,kind:Vc(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:Gc(g),usage:g,blackboardReferences:qc(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=Wr(d),s.push(...l.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:r,nodes:s}}function Kc(e){return`${e.kind}\0${e.id}`}function Ut(e){return Ro(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 $t(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 Bo(e){let t=new Map;for(let n of e){let o=Kc(n.key),i=t.get(o)??[];i.push(n),t.set(o,i)}return t}function Kr(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 Hc(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 _o(e,t){if(e.kind==="element"){Hc(e)&&t(e);for(let n of e.children||[])_o(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 lt(n,o,t)}function Ao(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 M=e.slice(s,s+1+p),P=$(n,t+s),B=$(n,t+s+M.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 \`${M}\``,P,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 \`${M}\``,P,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 qt(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 Hr(e){let t="",n=[0];for(let o=0;o<e.length;){let i=Jc(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 Jc(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:qt(s),end:t+s.length}}let i=/^&#x([0-9a-fA-F]+);/.exec(n);if(i){let s=i[0];return{value:qt(s),end:t+s.length}}let r=/^&#([0-9]+);/.exec(n);if(r){let s=r[0];return{value:qt(s),end:t+s.length}}}function Jr(e){return lt(e.line,e.character,e.offset)}function Yc(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function Zc(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function Qc(e){return e===" "||e===" "||e===`
|
|
13
|
+
`||e==="\r"}function eu(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
|
|
14
|
+
`&&e!=="\r"}function Fe(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 lt(s,a,r)}function p(){return r>=e.length}function m(b=0){return e[r+b]}function f(b=1){for(let w=0;w<b;w+=1)e[r++]===`
|
|
15
|
+
`?(s+=1,a=0):a+=1}function y(){for(;!p()&&Qc(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(!Yc(m()))return"";let b=r;for(f();!p()&&Zc(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(),Ao(L,E.offset,e,g);let Ce=Hr(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 Ql=c();y();let Qn=c(),ze=x(),at=c();if(!ze.ok&&(g("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",Qn,at,{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}\``,_,at,{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:ze.value,...ze.valueOffsets?{valueOffsets:ze.valueOffsets}:{},range:I(_,at),fullRange:I(_,at),nameRange:I(_,L),equalsRange:I(Ce,Ql),valueRange:ze.valueRange||I(Qn,at),valueContentRange:ze.valueContentRange||I(Qn,at)}),!ze.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(eu(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}Ao(E,w,e,g);let _={kind:"text",text:qt(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 Pe(){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)==="/")Pe();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&&_o(O,b=>{g("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",Jr(b.range.start),Jr(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"]})}),Kr({document:i,diagnostics:n,partial:d,options:t})}var Vt={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Yr(e){if(!e)return Vt;let t=typeof e.indentWidth=="number"?e.indentWidth:Vt.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:Vt.xmlDeclaration,o=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:Vt.blankLineBetweenBehaviorTrees,i=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:Vt.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 tu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function nu(e,t,n){return`${" ".repeat(e*n)}${t}`}function yt(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?[nu(t,vn(c),n)]:[]}let r=tu(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 yt(e,t,`>${vn(a)}</${e.name}>`,n)}if(r.length===0){if(e.selfClosing)return yt(e,t,"/>".slice(0),n);let c=yt(e,t,">",n);return c.push(`${i}</${e.name}>`),c}let d=yt(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 ou(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Zr(e,t,n,o){let i=[],r=ou(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 ht(e,t={}){let n=Fe(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=Yr(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(...yt(i,0,">",s)),a.push(...Zr(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
|
+
`;(r.lineEnding==="crlf"||r.lineEnding==="auto"&&e.includes(`\r
|
|
16
17
|
`))&&(d=`\r
|
|
17
|
-
`);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(f=>f.severity!==h.Error)}}function Eo(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 wo(e,t,n){let o=t.valueContentRange??t.valueRange,r=Eo(t,n.start),i=Eo(t,n.end),s=$(e.originalText,o.start.offset+r),a=$(e.originalText,o.start.offset+i);return C(s,a)}function qi(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Xi(e,t){return e.includeIssuesByUri.get(t)??[]}function Gi(e,t){return e.suppressionIssuesByUri.get(t)??[]}function zi(e){let{document:t,semantic:n,config:o,view:r}=e,i=new Map(r.nodes.map(d=>[d.element,d])),s=new Map(r.subtreeCalls.map(d=>[d.node.element,d])),a=ye(o),l=Oc(t.root);return{document:t,view:r,semantic:n,config:o,options:e.options,facts:e.facts,report(d){let c=E(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=Xi(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getSuppressionIssues(d){let c=Gi(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getNodeUsage(d){return _e(n,{element:d,documentRoot:t.root,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},getPortUsage(d,c){return mn(n,{element:d,documentRoot:t.root,attributeName:c,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},resolveSubTree(d,c){return Lt(n,{id:d,fileLocalUri:c,config:o})},getNodeModel(d){return Be(n,d)},getBehaviorTrees(d){return be(n,d)},getTreeNodeView(d){return i.get(d)},getSubTreeCallView(d){return s.get(d)}}}function Oc(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return No(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||No(n,t);return t}function No(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&No(n,t)}function I(e){let t=z[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var $c={"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 Fe(e){return I({name:$c[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Uc(n)})}}}})}function Uc(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 Wi=[Fe("missing-path"),Fe("not-found"),Fe("cycle"),Fe("outside-root"),Fe("unresolved-variable"),Fe("depth-exceeded"),Fe("too-many-files"),Fe("external-used")];import Vc from"ajv";var qc=Vc,Xc=new qc,Gc=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],zc={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}},Po=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"]),Ki=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 Hi(e){return e.children.filter(t=>t.kind==="element")}function me(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function Ji(e){return e.children.some(t=>t.kind==="element")}function bn(e,t){let n=Yi(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Yi(e){let t=Ut(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 hn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Yc(e.registry,n,e.value)?void 0:hn(e.diagnosticCode,e.value,e.portLabel);let o=e.typeDefinition?.canonical??e.port.type;if(o&&!Qi(o,e.value))return Wc(o)?hn(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 We(e){return e.effectiveType??e.type}function Zi(e,t){return ue(e,We(t))}function Ut(e,t){let n=Q({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function hn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Wc(e){let t=Ct(e)??e;return es(e)!==void 0||Zc.has(t.toLowerCase())}function Qi(e,t){let n=es(e);if(n)return Kc(n,t);let o=(Ct(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 Gc.includes(t);default:return Po.has(o)||Ki.has(o)?ts(o,t):!1}}function es(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Kc(e,t){let n=Jc(t);return n?n.every(o=>Hc(e,o)):!1}function Hc(e,t){if(t.kind==="string")return Qi(e,t.value);let n=(Ct(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 Po.has(n)||Ki.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&ts(n,String(t.value)):!1}}function ts(e,t){let n=zc[e];if(!n)return!1;if(Po.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 Jc(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 Yc(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((r,i)=>{let s=t.items[i];return s?Yi({port:{name:`tuple[${i}]`,type:s},value:r,registry:e,typeDefinition:ue(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${i}]`})===void 0:!1})}case"json-schema":try{let o=JSON.parse(n);return Xc.compile(t.schema)(o)===!0}catch{return!1}}}var Zc=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 ns=[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=Zn(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 Ft(e.semantic))t.uri&&t.uri!==e.document.uri||Qc(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(!eu(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 i=tu(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!i)return;let a=e.getNodeModel(i)?.ports.find(l=>l.name===o);if(a){if(a.direction==="output"){Ut(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}bn(e,{port:a,value:n.value,range:n.range,registry:pe(e.semantic),typeDefinition:he(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=pe(e.semantic),n=new Map,o=e.options.allowStringEntryCompatibility??!0;for(let r of e.view.nodes)for(let i of r.portBindings){if(i.declaredPort.status!=="resolved")continue;let s=Ut(i.name,i.value);if(!s)continue;let a=Zi(t,i.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:on(s),identity:l,nodeId:ru(r.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(l,d)}for(let r of n.values()){let i=nu(e.semantic,r,o);if(i.length<2)continue;let s=r.find(a=>a.typeDefinition.canonical===i[0]);e.report({code:u.BlackboardTypeMismatch,message:`blackboard entry \`${s?.displayName??r[0]?.displayName??r[0]?.key??""}\` is used with incompatible port types: ${i.map(a=>`\`${a}\``).join(", ")}`,range:s?.range,details:{primaryLabel:`blackboard entry \`${s?.displayName??r[0]?.displayName??r[0]?.key??""}\` mixes incompatible port types`,notes:r.filter(a=>i.includes(a.typeDefinition.canonical)).map(a=>`${a.nodeId}.${a.port.name} declares ${ou(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 write to a blackboard remap."},create(e){return{Element(t){if(iu(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let r=e.getPortUsage(t,o.name);r?.status==="resolved"&&r.port.direction==="output"&&Ut(r.port.name,o.value)===void 0&&e.report({code:u.OutputPortRequiresRemap,message:`output port \`${r.port.name}\` must be remapped to a blackboard entry`,range:o.range,details:{primaryLabel:`output port \`${r.port.name}\` requires a blackboard remap`,help:`use \`${r.port.name}="{${r.port.name}}"\` or \`${r.port.name}="{some_key}"\``}})}}}}})];function Qc(e,t){return e.diagnostics.some(n=>n.code===u.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function eu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function tu(e,t){if(!e)return;return n(e,!1,void 0);function n(o,r,i){let s=r||o.name==="TreeNodesModel",a=s&&(o.name==="Action"||o.name==="Condition"||o.name==="Control"||o.name==="Decorator"||o.name==="SubTree")?o:i;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 nu(e,t,n){let o=new Set;for(let r=0;r<t.length;r+=1){let i=t[r];if(i)for(let s=r+1;s<t.length;s+=1){let a=t[s];a&&(n&&(i.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||ut(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(o.add(i.typeDefinition.canonical),o.add(a.typeDefinition.canonical)))}}return[...o].sort()}function ou(e,t){return We(e)??t.canonical}function ru(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function iu(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var su=new Set(["_failureIf","_successIf","_skipIf","_while"]),au=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Mo(e){if(su.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(au.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 Bo(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=nn({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 os=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),rs=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function is(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(ss(o)){n++;continue}if(_o(o)){let a=n;for(n++;n<e.length&&cu(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(Ke(o)){let a=du(e,n);t.push(a),n=a.end;continue}if(o==="'"){let a=lu(e,n);t.push(a),n=a.end;continue}let r=e.slice(n,n+2),i=os.get(r);if(i){t.push({type:i,text:r,start:n,end:n+2}),n+=2;continue}let s=rs.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 lu(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 du(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let r=n;for(;n<e.length&&uu(e[n]);)n++;return r===n||mu(e,n)?(n=Vt(e,n),qt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Ke(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(!Ke(e[n+1]))return n=Vt(e,n+1),qt(e,t,n);for(o="Real",n+=1;n<e.length&&Ke(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let r=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let i=n;for(;n<e.length&&Ke(e[n]);)n++;if(i===n)return n=Vt(e,Math.max(n,r+1)),qt(e,t,n);o="Real"}return pu(e,n)?(n=Vt(e,n),qt(e,t,n)):{type:o,text:e.slice(t,n),start:t,end:n}}function Vt(e,t){let n=t;for(;n<e.length;){let o=e[n];if(ss(o)||rs.has(o)||os.has(e.slice(n,n+2))||o==="."&&e[n+1]===".")break;n++}return n}function qt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ss(e){return e===" "||e===" "||e===`
|
|
18
|
-
`||e==="\r"}function _o(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function cu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Ke(e){return e!==void 0&&/[0-9]/.test(e)}function uu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function pu(e,t){let n=e[t];return _o(n)||Ke(n)}function mu(e,t){let n=e[t];return n==="."||_o(n)||Ke(n)}var fu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),gu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),as=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),se={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Gt(e){let t=is(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}:ls(t,e)}function ls(e,t=""){let n=new Ao(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 i=n.parseExpression(0);if(!i)return{ok:!1,errors:n.errors,tokens:e};for(o.push(i);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let r=Su(o);return{ok:!0,program:{kind:"Program",statements:o,range:r},tokens:e}}var Ao=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 r=fu.get(o.type);if(r){if(t>=se.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:r,left:n,right:l,range:Xt(n.range,l.range)};break}if(o.type==="Question"){if(t>=se.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(se.ternary);if(!d)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:d,range:Xt(n.range,d.range)};break}let i=as.get(o.type);if(i){if(t>=se.comparison)break;this.consume();let l=[n],d=[i],c=this.parseExpression(se.comparison);if(!c)return;for(l.push(c);;){let p=as.get(this.peek().type);if(!p)break;this.consume();let m=this.parseExpression(se.comparison);if(!m)return;d.push(p),l.push(m)}n={kind:"ComparisonChain",operands:l,operators:d,range:Xt(l[0].range,l[l.length-1].range)};continue}let s=gu.get(o.type),a=s?bu(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:Xt(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:He(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),yu(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:hu(t.type),argument:n,range:Xt(He(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),o=this.parseExpression(0);if(!o)return;let r=this.peek();if(r.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",r);return}return this.consume(),vu(o,{start:n.start,end:r.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:He(o)})}};function yu(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:He(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:He(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:He(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:He(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function hu(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function bu(e){switch(e){case"PipePipe":return se.pipePipe;case"AmpAmp":return se.ampAmp;case"Pipe":case"Caret":return se.pipeCaret;case"Ampersand":return se.ampersand;case"Plus":case"Minus":case"DotDot":return se.additive;case"Star":case"Slash":return se.multiplicative;default:return}}function He(e){return{start:e.start,end:e.end}}function Xt(e,t){return{start:e.start,end:t.end}}function vu(e,t){return{...e,range:t}}function Su(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var xu=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 jo(e={}){let t=at(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>It(t,s,a)),o=new Map,r=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:ku(e.enums,e.augmentations??[])};for(let s of e.symbols??[])ds(i.symbols,o,s,n);for(let s of e.globalBlackboardSymbols??[])ds(i.globalBlackboard,r,s,n);return i}function Je(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 Fo(e){let t=Je(e.baseEnvironment),n=[];for(let o of e.entries){let r=Je(t),i=o.parseResult??Gt(o.source),s=Je(r),a;i.ok&&(a=Wt({program:i.program,environment:r,attributeName:o.attributeName,originId:o.originId??String(o.id)}),s=Je(a.environment)),n.push({id:o.id,parseResult:i,environmentBefore:r,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,r]of Object.entries(n.script?.enums??{}))t.set(o,r);return t}function zt(e,t){let n=ue(e,t);return us(t,n)}function us(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"}:xu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function ps(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function gt(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function Ye(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Lo(e,t){return e.kind==="error"||t.kind==="error"?{kind:"error"}:e.kind==="unknown"||t.kind==="unknown"?{kind:"unknown"}:e.kind==="any"||t.kind==="any"?e.kind===t.kind?e:{kind:"unknown"}:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"&&e.canonical===t.canonical?e:void 0:e.kind===t.kind?e:void 0}function ku(e,t){if(e instanceof Map)return new Map(e);let n=cs(t??[]);for(let[o,r]of Object.entries(e??{}))n.set(o,r);return n}function ds(e,t,n,o){let r=e.get(n.name);if(!r){e.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let i=t.get(n.name),s=r.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!o(i,n.compatibilityKey)||!ps(r.type,n.type);e.set(n.name,{...r,readable:r.readable||n.readable,writable:r.writable||n.writable,conflict:s}),i===void 0&&t.set(n.name,n.compatibilityKey)}var Ze={kind:"number"},Sn={kind:"string"},vn={kind:"bool"},ae={kind:"unknown"},O={kind:"error"};function Wt(e){let t=Je(e.environment),n=[],o=[],r=[],i=[],s=[],a=[],l=[],d=[];return e.program.statements.forEach((c,p)=>{d.push(ve({expression:c,statementIndex:p,environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:r,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:r,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,statementTypes:d,finalType:d.at(-1)}}function ve(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Ze:t.valueKind==="string"?Sn:t.valueKind==="boolean"?vn:ae;case"Identifier":return Tu(e,t.name,t.range);case"UnaryExpression":{let n=ve({...e,expression:t.argument});return t.operator==="!"?Ye(n)?vn:(te(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"?Ze:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?O:ae:(te(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=ve({...e,expression:t.left}),o=ve({...e,expression:t.right});switch(t.operator){case"&&":case"||":return fs(n)||fs(o)?(te(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):vn;case"+":return n.kind==="string"&&o.kind==="string"?Sn:n.kind==="number"&&o.kind==="number"?Ze:Oo(n,o)?ae:($o(e,t.range,t.operator),O);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&o.kind==="number"?Ze:Oo(n,o)?ae:($o(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")?Sn:Oo(n,o)?ae:($o(e,t.range,t.operator),O)}return ae}case"ComparisonChain":{let n=t.operands.map(o=>ve({...e,expression:o}));for(let o=0;o<t.operators.length;o+=1){let r=t.operators[o],i=n[o],s=n[o+1];if(!Du(r,i,s))return te(e,"invalid-operand-type",{start:t.operands[o]?.range.start??t.range.start,end:t.operands[o+1]?.range.end??t.range.end},`operator \`${r}\` cannot compare these operand types`,`comparison operands for \`${r}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),O}return vn}case"ConditionalExpression":{let n=ve({...e,expression:t.condition});Ye(n)||te(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=ve({...e,expression:t.thenExpression}),r=ve({...e,expression:t.elseExpression}),i=Lo(o,r);return i||(te(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 Ru(e)}}function Ru(e){let{environment:t,attributeName:n,identifiers:o,introducedSymbols:r}=e,i=e.expression,s=ve({...e,expression:i.right});if(i.left.kind!=="Identifier")return ve({...e,expression:i.left}),te(e,"invalid-operand-type",i.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),O;let a=i.left,l=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",d={name:a.name,kind:l,range:a.range,identifier:a,statementIndex:e.statementIndex};o.push(d);let c=Bo(a.name);if(c.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(d),gs(e,a.range,c.raw,c.message),O;if(c.kind==="global-blackboard"){let g=t.globalBlackboard.get(c.key),y=i.operator===":="?s:i.operator==="="?g&>(g.type,s)?s:g?void 0:s:ms(g?.type??ae,s,i.operator);if(i.operator!==":="&&i.operator!=="="&&!y)return te(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),O;if((i.operator===":="||i.operator==="=")&&g&&!gt(g.type,s))return Uo(e,a,g.type,s),O;let f=g?{...g}:{name:c.key,type:s,source:{kind:"global-blackboard",key:c.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return f.type=y??s,t.globalBlackboard.set(c.key,f),e.resolvedIdentifiers.push({access:d,resolution:{kind:"global-blackboard",key:c.key,symbol:f}}),e.globalBlackboardAccesses.push({key:c.key,rawName:a.name,kind:l,range:a.range,inferredType:f.type}),f.type}let p=t.symbols.get(a.name);if(i.operator===":="&&!p){let g={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,g),e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:g}}),r.push(g),s}if(!p)return e.resolvedIdentifiers.push({access:d,resolution:{kind:"unknown"}}),te(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}}),i.operator==="=")return gt(p.type,s)?(Vo(p,s),s):(Uo(e,a,p.type,s),O);if(i.operator===":=")return gt(p.type,s)?(Vo(p,s),s):(Uo(e,a,p.type,s),O);let m=ms(p.type,s,i.operator);return m?(Vo(p,m),m):(te(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),O)}function Tu(e,t,n){let o={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(o);let r=Bo(t);if(r.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(o),gs(e,n,r.raw,r.message),O;if(r.kind==="global-blackboard"){let a=e.environment.globalBlackboard.get(r.key);return e.globalBlackboardAccesses.push({key:r.key,rawName:t,kind:"read",range:n,inferredType:a?.type??ae}),e.resolvedIdentifiers.push({access:o,resolution:{kind:"global-blackboard",key:r.key,...a?{symbol:a}:{}}}),a?.type??ae}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:o,resolution:{kind:"enum",name:t,value:i}}),Ze;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),ae)}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"?ae:n==="+="?e.kind==="number"&&t.kind==="number"?Ze:e.kind==="string"&&t.kind==="string"?Sn:void 0:e.kind==="number"&&t.kind==="number"?Ze:void 0}function Oo(e,t){return xn(e)||xn(t)}function xn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function fs(e){return!Ye(e)}function Du(e,t,n){return xn(t)||xn(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 $o(e,t,n){te(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 Uo(e,t,n,o){te(e,"variable-type-mismatch",t.range,`cannot assign ${qo(o)} to variable \`${t.name}\` of type ${qo(n)}`,`\`${t.name}\` expects ${qo(n)} here`,"assign a compatible value or change the variable's source type")}function gs(e,t,n,o){te(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 Vo(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 te(e,t,n,o,r,i){e.diagnostics.push({code:t,range:n,message:o,details:{primaryLabel:r,help:i}})}function qo(e){return e.kind==="custom"?e.name:e.kind}var ys=new WeakMap;function kn(e,t){let n=e.getNodeUsage(t),o=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(r=>{let i=Mo({elementName:t.name,attributeName:r.name,resolvedNodeType:o});return i?[{attribute:r,info:i,parseResult:Gt(r.value)}]:[]})}function fe(e,t,n){return wo(e.document,t,n)}function hs(e){return{start:0,end:e.value.length}}function Le(e,t){let n=e.getTreeNodeView(t),o=n?.behaviorTree;return!n||!o?kn(e,t).map(r=>{let i=bs(e,[]);return{...r,environment:i,analysis:r.parseResult.ok?Wt({program:r.parseResult.program,environment:i,attributeName:r.attribute.name}):void 0}}):Cu(e,o).filter(r=>r.node.element===t).map(r=>({...r.candidate,environment:r.environmentBefore,analysis:r.analysis}))}function Cu(e,t){let n=ys.get(e.view);n||(n=new WeakMap,ys.set(e.view,n));let o=n.get(t);if(o)return o;let r=t.nodes.flatMap(s=>kn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),i=Fo({baseEnvironment:bs(e,t.nodes),entries:r.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=r[a];return l?[{...s,node:l.node,candidate:l.candidate}]:[]});return n.set(t,i),i}function bs(e,t){let n=pe(e.semantic),o=[],r=[],i=t[0]?.behaviorTree.id;if(i){let s=e.getNodeModel(i);if(s?.kind==="SubTree")for(let a of s.ports){let l=We(a),c=he(e.semantic,l)?.canonical??l;o.push({name:a.name,type:zt(n,l),source:{kind:"subtree-port",nodeType:i,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=Q({portName:a.usage.port.name,rawValue:a.usage.value});if(!l.ok||l.reference.scope==="global")continue;let d=We(a.usage.port),p=he(e.semantic,d)?.canonical??d,m=a.usage.port.direction,g=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;o.push({name:l.reference.key,type:zt(n,d),source:{kind:"port-remap",nodeType:g,portName:a.usage.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}return r.push(...Iu(e,n)),jo({symbols:o,globalBlackboardSymbols:r,augmentations:So(e.semantic),areTypesCompatible:(s,a)=>s&&a?ut(e.semantic,s,a):!0})}function Iu(e,t){let n=[];for(let o of e.view.nodes){let r=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let i of o.portBindings){if(i.usage.status!=="resolved")continue;let s=Q({portName:i.usage.port.name,rawValue:i.usage.value});if(!s.ok||s.reference.scope!=="global")continue;let a=We(i.usage.port),d=he(e.semantic,a)?.canonical??a,c=i.usage.port.direction;n.push({name:s.reference.key,type:zt(t,a),source:{kind:"global-blackboard-remap",nodeType:r,portName:i.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 vs=I({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Le(e,t))if(n.analysis)for(let o of n.analysis.unknownIdentifiers)e.report({code:u.UnknownScriptVariable,message:`unknown script variable \`${o.name}\``,range:fe(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 Ss=I({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Le(e,t))if(n.analysis)for(let o of n.analysis.diagnostics){let r=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;r&&e.report({code:r,message:o.message,range:fe(e,n.attribute,o.range),details:o.details})}}}}});var xs=I({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Le(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:fe(e,n.attribute,o.range),details:o.details})}}}});var ks=I({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Le(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let o=n.parseResult.program.statements.at(-1),r=n.analysis.finalType;!o||!r||Ye(r)||e.report({code:u.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:fe(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 Rs=I({name:"script/valid-syntax",create(e){return{Element(t){for(let n of kn(e,t))if(!n.parseResult.ok)for(let o of n.parseResult.errors){let r=o.kind==="empty-script"?u.EmptyScript:o.kind==="invalid-token"?u.InvalidScriptToken:u.InvalidScriptSyntax;e.report({code:r,message:o.message,range:o.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??fe(e,n.attribute,hs(n.attribute)):fe(e,n.attribute,o.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Ts=[Rs,vs,Ss,xs,ks];var Eu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Ds(e){return I({name:Eu[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 Cs=[Ds("unused"),Ds("missing-reason")];function Rn(e,t){return e.attributes.find(n=>n.name===t)}function Is(e,t){if(!e)return!1;let n=(o,r)=>{let i=r||o.name==="TreeNodesModel";if(o===t)return i;for(let s of o.children)if(s.kind==="element"&&n(s,i))return!0;return!1};return n(e,!1)}var Es=[I({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||Rn(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=_t(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 pt(e.semantic)){let n=be(e.semantic,t);if(n.length<=1||new Set(n.map(i=>i.uri)).size<=1)continue;let r=n.filter(i=>i.uri===e.document.uri);r.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:r[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=Rn(t,"main_tree_to_execute");!n?.value||go(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"||Is(e.document.root,t))return;let n=e.getSubTreeCallView(t),o=n?.node.element.attributes.find(i=>i.name==="ID")??Rn(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"||Is(e.document.root,t))return;let n=Rn(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let r=e.resolveSubTree(n.value,e.document.uri);r.status!=="ambiguous"||r.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 Nu=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Pu(e,t){return e===t?String(e):`${e}\u2013${t}`}var ws=I({name:"model/valid-child-count",create(e){return{Element(t){if(me(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Mu(e,t,n.model.model.id,n.model.model.kind)}}}});function Mu(e,t,n,o){let r=Hi(t).length,i=Nu.get(n);if(i){if(r<i.min||r>i.max){let s=Pu(i.min,i.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${r}.`,range:t.range})}return}if(o==="Action"||o==="Condition"){r>0&&e.report({message:`${o} node \`${n}\` must not have child nodes, but has ${r}.`,range:t.range});return}if(o==="Decorator"){r!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${r}.`,range:t.range});return}if(o==="Control"){r<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}o==="SubTree"&&r>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${r}.`,range:t.range})}var Ns=I({name:"model/valid-port-value",create(e){return{Element(t){if(me(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let r=e.getPortUsage(t,o.name);r?.status==="resolved"&&bn(e,{port:r.port,value:o.value,range:o.range,registry:pe(e.semantic),typeDefinition:he(e.semantic,r.port.type),allowRemap:!0,diagnosticCode:u.InvalidPortValueType,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:o.name})}}}}});var Ps=I({name:"model/require-port",create(e){return{Element(t){if(me(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(i=>i.name===o.name&&i.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 Ms=[I({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(me(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(me(t)||t.selfClosing||Ji(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 Bs=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(r=>r.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:o?.valueContentRange??o?.valueRange??t.range})}}}});var _s=I({name:"model/no-unknown-port",create(e){return{Element(t){if(me(t))return;let n=e.getNodeUsage(t);for(let o of n.portUsages){if(o.status!=="undeclared")continue;let r=n.ports.map(s=>s.name).sort(),i=r.length>=1&&r.length<=8?[`note: defined ports: ${r.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:i}:void 0})}}}}});var As=[Bs,_s,Ps,Ns,...Ms,ws];function Bu(e,t){return e.attributes.find(n=>n.name===t)}function _u(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var js=[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||Bu(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)||_u(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Xo=[...js,...Ts,...Es,...ns,...As,...Wi,...Cs],zb=new Map(Xo.map(e=>[e.name,e]));function Fs(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Ls(e,t){return we(e.linter.rules[t])?.options??{}}function Os(e){let t=we(e.config.linter.rules[e.rule]);return Fs(t?t.severity:e.defaultSeverity)}function $s(e){let t=[],n=e.facts??qi(),o=e.rules?new Set(e.rules):void 0,r=[];for(let s of Xo){if(o&&!o.has(s.name))continue;let a=Os({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=Ls(e.config,s.name),d=s.optionsSchema?.safeParse(l),c=d?.success?d.data:l,p=zi({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});r.push(s.create(p))}for(let s of r)s.Document?.();e.document.root&&Us(e.document.root,r);let i=_t(e.semantic,e.document.uri);for(let s of i?.treeNodesModel??[])for(let a of r)a.TreeNodeModel?.(s);for(let s of r)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Au(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Us(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Us(n,t)}function Au(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 Go(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let o=[...e.diagnostics],r=n.documentView??Ae(e,{semantic:t,config:n.config,policy:ye(n.config)});return o.push(...$s({document:e,view:r,semantic:t,config:n.config})),o}import nr from"path";function ju(e){return e.endsWith("/")?e:`${e}/`}function Fu(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):zo(e.split("/"))}function zo(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function Qe(e,t={}){let n=e.replace(/\\/g,"/"),o=s=>Fu(s,t.preserveDotSegments),r=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(r?.groups)return{scheme:r.groups.scheme,authority:r.groups.authority,absolute:!0,segments:o(r.groups.path||"/")};let i=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return i?.groups?{authority:i.groups.drive,absolute:!0,segments:o(i.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:o(n)}}function Tn(e){let n=zo(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 Lu(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Kt(e){return Tn(Qe(e))}function Ou(e,...t){let n=Qe(e),o=[...n.segments];for(let r of t){let i=Qe(r,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return Kt(r);i.absolute&&(o.length=0),o.push(...i.segments)}return Tn({...n,segments:zo(o)})}function $u(e){let t=Qe(e);return t.segments.length===0?Tn(t):Tn({...t,segments:t.segments.slice(0,-1)})}function Uu(e){return Qe(e).segments.at(-1)??""}function Vu(e,t){let n=Qe(e),o=Qe(t);if(!Lu(n,o))return Kt(t);let r=0;for(;r<n.segments.length&&r<o.segments.length&&n.segments[r]===o.segments[r];)r+=1;let i=new Array(n.segments.length-r).fill(".."),s=o.segments.slice(r);return[...i,...s].join("/")}function qu(e,t){let n=ju(Kt(e)),o=Kt(t);return o===n.slice(0,-1)||o.startsWith(n)}var K={normalize:Kt,join:Ou,dirname:$u,basename:Uu,relative:Vu,isWithin:qu};function Se(e,...t){return K.join(e,...t)}function Vs(e){return K.dirname(e)}function qs(e){return K.basename(e)}function Oe(e,t){return K.relative(e,t)}function Xs(e,t){return K.isWithin(e,t)}async function Ws(e,t,n){let o=e;for(;;){for(let i of t){let s=K.join(o,i);if(await n.exists(s))return s}let r=K.dirname(o);if(r===o)return;o=r}}async function Xu(e,t){return Ws(e,["btxml.config.json"],t)}async function Gs(e,t){return JSON.parse(await t.readFile(e))}function zs(e,t){return e.map(n=>E(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function Ks(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await Xu(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[E("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 Gs(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[E("CFG001_INVALID_CONFIG_JSON",h.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let i=await Ws(e.startUri,["package.json"],e.host);if(i)try{let s=await Gs(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let o=dt(n);if(!o.ok)return{ok:!1,configUri:t,diagnostics:zs(o.diagnostics,t)};let r=co(o.value);return r.length>0?{ok:!1,configUri:t,diagnostics:zs(r,t)}:{ok:!0,config:o.value,configUri:t,diagnostics:[]}}import Gu from"ignore";function Wo(e){return e.replace(/\\/g,"/")}function V(e,t){return Wo(Oe(e,t))}function zu(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let r=t[o],i=t[o+1],s=t[o+2];if(r==="*"&&i==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(r==="*"&&i==="*"){n+=".*",o+=1;continue}if(r==="*"){n+="[^/]*";continue}if(r==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(r)?n+=`\\${r}`:n+=r}return n+="$",new RegExp(n)}function $e(e,t){let n=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||qs(n)===o:zu(o).test(n)}function Wu(e){return e.includes("*")||e.includes("?")}async function Hs(e,t,n,o,r,i,s,a){let l=V(n,t);if(l&&o.some(c=>$e(l,c)||$e(`${l}/`,c)||$e(`${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=Se(t,c.name),m=c.type==="directory",g=c.type==="file";if(c.type==="other"&&i&&e.realpath)try{let y=await e.realpath(p);if(s.has(y))continue;s.add(y);let f=await e.stat(y);m=f?.type==="directory",g=f?.type==="file"}catch{continue}m?await Hs(e,p,n,o,r,i,s,a):g&&r.push(p)}}async function Ht(e,t,n,o,r,i,s){let a=new Set,l=new Set,d=[],c=r??t;for(let m of e){let g=Se(c,m);if((await s.stat(g))?.type==="file"){let y=V(t,g),f=!y.startsWith("..");!n.some(x=>$e(y,x))&&(!f||!i?.ignores(y))&&a.add(g);continue}if(!Wu(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 Hs(s,t,t,n,p,o,m,i)}for(let m of p){let g=V(c,m);d.some(y=>$e(g,y))&&(n.some(y=>$e(V(t,m),y))||i?.ignores(V(t,m))||a.add(m))}for(let m of d)p.some(y=>{let f=V(c,y);return $e(f,m)&&!n.some(x=>$e(V(t,y),x))&&!i?.ignores(V(t,y))})||l.add(m);return{files:[...a].sort((m,g)=>V(t,m).localeCompare(V(t,g))),unmatchedPatterns:[...l].sort()}}async function Ku(e,t){let n=Se(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")):[]}function Hu(e){return Gu().add(e)}async function Js(e,t,n,o,r){let i=[...t.ignore],s=t.useGitignore?await Ku(e,r):[],a=Hu(s),l=n?.length?n:t.include,d=await Ht(l,e,i,t.followSymlinks,n?.length?o:void 0,a,r),c=t.maxSize,p=[],m=[];for(let g of d.files){let y=V(e,g),f=await r.stat(g);if(f){if((f.size??0)>c){m.push({path:y,reason:"too-large"});continue}p.push({path:y,uri:g,kind:"unknown"})}}return{selectedFiles:p,skippedFiles:m,unmatchedPatterns:d.unmatchedPatterns}}function Ys(e){return e.entrypoints.map(t=>({file:Wo(t)}))}function Ko(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function Zs(e,t,n,o){let r=[];for(let i of t)await o.exists(Se(e,i.file))||r.push(E(u.EntrypointNotFound,h.Error,`entrypoint file not found \`${i.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return r}async function Qs(e,t,n,o){let r=await Ht(t.files,e,[],n.followSymlinks,void 0,void 0,o),i=await Ht(t.definitions,e,[],n.followSymlinks,void 0,void 0,o),s=await Ht(t.augmentations,e,[],n.followSymlinks,void 0,void 0,o),a=r.files.map(c=>({path:V(e,c),uri:c,kind:"model-xml"})),l=i.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:r.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:i.unmatchedPatterns}}}function Ho(e){return e.rootUri}function Jo(e){return e.configUri}function Yo(e){return e.config}function et(e){return e.resolvedConfig}function Zo(e){return e.selectedFiles.map(t=>({...t}))}function Qo(e){return e.modelFiles.map(t=>({...t}))}function er(e){return e.definitionFiles.map(t=>({...t}))}function tr(e){return e.skippedFiles.map(t=>({...t}))}async function Ju(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 ea(e){let t=await Ks({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=an(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let o=n.config,r=await Ju({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Js(r,o.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?V(r,t.configUri):"",d=Ys(o.resolver);for(let f of d){let x=K.join(r,f.file);await e.host.exists(x)&&!i.some(b=>b.uri===x)&&i.push({path:f.file,uri:x,kind:"bt-xml"})}let{modelFiles:c,augmentationFiles:p,definitionFiles:m,unmatchedPatterns:g}=await Qs(r,o.models,o.files,e.host);for(let f of g.models)a.push(E(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${f}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let f of g.definitions)a.push(E(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${f}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let f of g.augmentations)a.push(E(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${f}\``,void 0,l,{help:"check `models.augmentations` and make sure the file exists"}));let y=o.models.builtins;return a.push(...await Zs(r,d,l,e.host)),{ok:!0,diagnostics:a,project:{rootUri:r,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:o,selectedFiles:i,entrypoints:d,modelFiles:c,augmentationFiles:p,definitionFiles:m,skippedFiles:s,modelsBuiltins:y}}}import{constants as Qu}from"fs";import Jt from"fs/promises";import ep from"path";import ta from"path";import{fileURLToPath as Yu,pathToFileURL as na}from"url";function Zu(e){return e.startsWith("file://")?e:na(ta.resolve(e)).href}function ne(e){return Yu(Zu(e))}function tt(e){return na(ta.resolve(e)).href}function tp(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Ne(e=process.cwd(),t={}){let n=ep.resolve(e),o=tt(n);return{rootUri(){return o},async readFile(r){return Jt.readFile(ne(r),"utf8")},async exists(r){try{return await Jt.access(ne(r),Qu.F_OK),!0}catch(i){if(i.code!=="ENOENT")throw i;return!1}},async stat(r){try{let i=await Jt.stat(ne(r));return{type:tp(i),size:i.size}}catch{return}},async readDir(r){return(await Jt.readdir(ne(r),{withFileTypes:!0})).map(s=>({name:s.name,type:s.isFile()?"file":s.isDirectory()?"directory":"other"}))},async realpath(r){return tt(await Jt.realpath(ne(r)))},async resolvePackageUri(r){return t.resolvePackageUri?.(r)}}}async function or(e={}){let t=nr.resolve(e.cwd??process.cwd()),n=e.projectRoot?nr.resolve(t,e.projectRoot):t,o=Ne(n,e.hostOptions);return ea({rootUri:tt(n),host:o,configUri:e.configPath?tt(nr.resolve(t,e.configPath)):void 0,noConfig:e.noConfig,cliFiles:e.cliFiles,command:e.command})}var oa={InvalidJson:u.InvalidAugmentationJson,InvalidSchema:u.InvalidAugmentationSchema};function np(e){return E(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function op(e,t){return t.issues.map(n=>np({filePath:e,code:n.kind==="json"?oa.InvalidJson:oa.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 Dn(e){let t=e.project,n=e.host??t.host,o=[],r=[];for(let i of t.augmentationFiles){if(!await n.exists(i.uri)){o.push(E(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${i.path}\``,void 0,i.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(i.uri),a=ro(s,{uri:i.uri,path:i.path});if(!a.ok){o.push(...op(i.path,a));continue}r.push(a.data)}return{ok:o.every(i=>i.severity!==h.Error),augmentations:r,diagnostics:o}}function rp(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(r=>r.kind==="element"&&r.name==="TreeNodesModel");if(!n)return;let o=e.nodes.flatMap(r=>r===t?t.children.filter(i=>i===n||i.kind==="comment"):r.kind==="comment"?[r]:[]);return{...e,kind:"model-document",root:n,nodes:o,isBtXml:!0}}async function ip(e,t){return je(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function rr(e,t){if(!await t.exists(e.uri))return{diagnostics:[E(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 ip(e,t);if(!n.document||n.diagnostics.some(r=>r.severity===h.Error)){let r=n.diagnostics[0];return{diagnostics:[E(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:r?[`first XML error: ${r.code} ${r.message}`]:void 0})]}}let o=rp(n.document);return o?{document:o,diagnostics:[]}:{diagnostics:[E(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,r=[];for(let d of n.selectedFiles){if(!await o.exists(d.uri))continue;let c=await o.readFile(d.uri),p=je(c,{uri:d.uri,path:d.path});p.document&&r.push(p.document)}let i=await Promise.all(n.modelFiles.map(d=>rr(d,o))),s=await Dn({project:e,host:o}),a=i.flatMap(d=>d.diagnostics),l=i.flatMap(d=>d.document?[d.document]:[]);return{documents:r,externalModelDocuments:l,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function ra(e,t){return e.attributes.find(n=>n.name===t)}function ia(e,t){return Oe(e,t).replace(/\\/g,"/")}function sp(e,t,n,o,r){return e.replace(/\$\{([^}]+)\}/g,(i,s)=>s.startsWith("env:")?process.env[s.slice(4)]??i:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:r,variable:s,range:o,message:`unresolved include path variable \`${s}\``}),i))}function ap(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(i=>({name:i.name,pathAttribute:i.attribute,base:i.base==="project-root"?"project-root":"current-file"})),o=e.root;if(!o)return[];let r=[];for(let i of o.children||[]){if(i.kind!=="element")continue;let s=n.find(a=>a.name===i.name);s&&r.push({element:i,pathAttr:ra(i,s.pathAttribute),rosPackageAttr:ra(i,"ros_pkg"),base:s.base??"current-file"})}return r}async function sa(e){let t=e.project,n=e.host??t.host,o=e.resolvedConfig.resolver.includes.allowOutsideRoot,r=e.resolvedConfig.resolver.includes.maxDepth,i=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(f=>[ia(t.rootUri,f.path||f.uri),f])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},d=new Map,c=new Set,p=t.entrypoints.length?t.entrypoints.map(f=>f.file):t.selectedFiles.map(f=>f.path);l.entrypointFiles=[...new Set(p)];let m=new Set,g=new Set,y=async(f,x,b)=>{if(x.length>=r){s.push({kind:"depth-exceeded",uri:b?.uri??f,path:f,range:b?.range,message:`include \`${f}\` exceeds the configured maximum include depth`});return}if(l.reachableFiles.size>=i){s.push({kind:"too-many-files",uri:b?.uri??f,path:f,range:b?.range,message:`resolving \`${f}\` would exceed the configured file limit`});return}let S=f.replaceAll("\\","/");if(m.has(S)){let P=[...x.slice(x.indexOf(S)),S];l.cycles.push({files:P}),s.push({kind:"cycle",uri:b?.uri??S,path:S,cycle:P,range:b?.range,message:"include cycle detected"});return}if(g.has(S))return;m.add(S),l.reachableFiles.add(S);let T=Se(t.rootUri,S);c.add(T);let N=await n.exists(T),A=a.get(S);!A&&N&&(A=je(await n.readFile(T),{uri:T,path:S}).document,A&&a.set(S,A)),l.nodes.set(S,{path:S,document:A,exists:N}),A&&d.set(A.uri,A);let _=A?.uri??T;if(!N){s.push({kind:"not-found",uri:b?.uri??_,path:S,range:b?.range,message:`include file not found \`${S}\``}),m.delete(S);return}if(!A){m.delete(S);return}for(let P of ap(A,e)){if(!P.pathAttr){s.push({kind:"missing-path",uri:_,range:P.element.range,message:"missing include path"});continue}let Ce=sp(P.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,P.pathAttr.range,_),Z;if(P.rosPackageAttr){let D=P.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:_,packageName:D,range:P.rosPackageAttr.range,message:`include uses ros_pkg=\`${D}\` but ProjectHost.resolvePackageUri is not available`});continue}let M=await n.resolvePackageUri(D);if(!M){s.push({kind:"ros-package-not-found",uri:_,packageName:D,path:Ce,range:P.rosPackageAttr.range,message:`ROS package \`${D}\` could not be resolved for include path \`${Ce}\``});continue}Z=Se(M,Ce)}else{let D=P.base==="project-root"?t.rootUri:Vs(T);Z=Se(D,Ce)}let L=ia(t.rootUri,Z),Ge=Z;try{await n.exists(Z)&&(Ge=n.realpath?await n.realpath(Z):Z)}catch{}if(!Xs(t.rootUri,Ge)){if(!o){s.push({kind:"outside-root",uri:_,path:L,range:P.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:_,path:L,range:P.pathAttr.range,message:`external include used \`${Ce}\``})}l.edges.push({from:S,to:L,includeElementRange:P.element.range,includePathRange:P.pathAttr.range}),await y(L,[...x,S],{uri:_,range:P.pathAttr.range})}m.delete(S),g.add(S)};for(let f of l.entrypointFiles)await y(f,[]);return{graph:l,reachableUris:c,reachableDocuments:d,issues:s}}import{findNodeAtLocation as aa,parse as lp,parseTree as dp}from"jsonc-parser";function cp(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
19
|
-
`&&t.push(n+1);return n=>{let o=0,r=t.length-1;for(;o<=r;){let s=Math.floor((o+r)/2);t[s]<=n?o=s+1:r=s-1}let i=Math.max(0,o-1);return{line:i,character:n-t[i],offset:n}}}function la(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function da(e){let t=e.project,n=e.host??t.host,o=[],r=[],i=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){o.push(E(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=dp(l,d,{allowTrailingComma:!0,disallowComments:!1});try{if(a=lp(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 g=String(m.message||m);o.push(E(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:[g]}));continue}let p=io.safeParse(a);if(!p.success){for(let m of p.error.issues){let g=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:f}of g)o.push(E(u.InvalidNodeDefinitionSchema,h.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:y,help:f?`fix the schema issue at \`${f}\``:"fix the schema issue in the file",notes:f?[f]:[]}))}continue}for(let[m,g]of Object.entries(p.data.nodes)){i.has(m)&&o.push(E(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"})),i.add(m);let y=cp(l),f=la(aa(c,["nodes",m]),y),x=Tt(m,g),b=x.ports.map(S=>{let T=la(aa(c,["nodes",m,"ports",S.name]),y);return{...S,source:"node-definition-file",uri:s.path,range:T,nameRange:T}});r.push({...x,ports:b,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:f},editable:!0,uri:s.path,range:f,elementRange:f})}}return{ok:o.every(s=>s.severity!==h.Error),nodeModels:r,diagnostics:o}}function ca(e,t){return Oe(e,t).replace(/\\/g,"/")}function up(e){return[...e.reachableDocuments.values()]}function ir(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function ua(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function pp(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 sr(e){let t=[],n=e.project,o=e.resolvedConfig,r=e.resolutionMode??Ko(o),i=r==="entrypoints"||e.resolveGraph?await sa({project:e.project,documents:e.documents,resolvedConfig:o,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await da({project:e.project,host:e.host});t.push(...l.diagnostics);let d=l.nodeModels,c=i&&(r==="entrypoints"||e.resolveGraph)?ir([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)&&i.reachableUris.has(f.uri)),...i.reachableDocuments.values(),...s]):ir([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)),...s]),p=Bt(c,{config:o,models:d,augmentations:a}),m={includeIssuesByUri:pp(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...p.diagnostics);let g=new Map(pt(p.index).map(f=>[f,be(p.index,f)])),y={mode:r,files:new Map(c.map(f=>[ca(n.rootUri,f.path||f.uri),f])),documentViews:new Map(c.map(f=>[f.uri,(()=>{let x=ee(o,ca(n.rootUri,f.path||f.uri));return Ae(f,{semantic:p.index,config:x,policy:ye(x)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(pt(p.index).map(f=>[f,be(p.index,f)])),reachableBehaviorTreesById:g,nodeModelsById:new Map(ho(p.index).map(f=>[f.id,f])),nodeModelSources:new Map(bo(p.index).map(f=>[f,jt(p.index,f).flatMap(x=>x.sourceMeta?[x.sourceMeta]:[])])),nodeDefinitionModels:[...d],entrypoints:n.entrypoints,workspace:p.index,facts:m};return{ok:t.every(f=>f.severity!==h.Error),index:y,diagnostics:t}}async function pa(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=[...e.projectDiagnostics??[]],r=e.host??t.host,i=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async y=>{let f=await rr(y,r);return o.push(...f.diagnostics),f.document?[f.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let y=await Dn({project:e.project,host:r});o.push(...y.diagnostics),s=[...y.augmentations]}let a=e.resolutionMode??Ko(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 sr({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:r}),c=ir([...e.documents,...up(d.index),...i]),p=n.linter.enabled!==!1,m=e.showSuppressed,g=[...d.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:i,augmentations:s,projectDiagnostics:o,indexResult:d,nodeDefinitionModels:g,fileDocuments:c,lintEnabled:p,showSuppressed:m,resolvedConfig:n,suppressionIssuesByUri:void 0}}var mp={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function ma(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function fp(e,t){let n=we(e.linter.rules[t]);return ma(n?n.severity:z[t].defaultSeverity)}function gp(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 fa(e){let t=[];for(let n of e.issues){let o=mp[n.kind],r=fp(e.config,o);if(!r)continue;let i=E(z[o].code,r,n.message,n.range,n.uri,void 0,gp(n));t.push({...i,rule:o})}return t}function ga(e,t){return Oe(e,t).replace(/\\/g,"/")}function yp(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function hp(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let o=ga(e,n);if(yp(o))return o}return ga(e,t.uri)}function ya(e){let{project:t,indexResult:n,externalModelDocuments:o,fileDocuments:r,lintEnabled:i,resolvedConfig:s}=e,a=t,l=n.index.mode;return r.map(d=>{let c=hp(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"?Bt([d,...o],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,m=l==="single-file"?(()=>{let y=ee(s,c);return Ae(d,{semantic:p,config:y,policy:ye(y)})})():n.index.documentViews.get(d.uri),g=[];if(i){let y=ee(s,c);g=Go(d,p,{config:y,documentView:m});let f=n.index.facts.includeIssuesByUri.get(d.uri)??[];g.push(...fa({issues:f,config:y}))}return e.input.mode==="check"&&d.kind==="generic-xml"?{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:[],rawDiagnostics:g,skipped:!0,skipReason:"generic-xml",originalText:d.originalText}:{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:g,rawDiagnostics:void 0,skipped:!1,originalText:d.originalText}})}function ha(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...ha(n.children));return t}function bp(e,t,n){let o=[],r=[];for(let i of e){let s=ha(i.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&&r.push({kind:"missing-reason",uri:i.uri,code:d,range:a.range,message:"missing suppression reason"}),l.startsWith("btxml-disable-file")?o.push({uri:i.uri,code:d,file:!0,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable-next-line")?n&&o.push({uri:i.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable")&&n&&o.push({uri:i.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c})}}return{suppressions:o,issues:r}}function ba(e,t){let n=bp(t.documents??[],!!t.requireReason,t.allowInline!==!1),o=[],r=[];for(let i of e){let s=n.suppressions.find(a=>a.uri===i.uri&&(!a.code||a.code===i.code||i.code.startsWith(a.code))&&(a.file||a.line===i.range?.start.line||a.line===(i.range?.start.line??0)+1));if(s){s.used=!0,r.push(i);continue}o.push(i)}for(let i of n.suppressions)i.used||n.issues.push({kind:"unused",uri:i.uri,code:i.code,range:i.range,message:i.code?`unused suppression for \`${i.code}\``:"unused suppression"});if(t.showSuppressed){let i=r.map(s=>({...s,severity:h.Info,suppressed:!0}));return{diagnostics:[...o,...i],suppressedDiagnostics:r,issues:n.issues}}return{diagnostics:o,suppressedDiagnostics:r,issues:n.issues}}function ar(e,t,n,o=e.resolvedConfig){let r=Pt(o.linter.rules,"suppression/require-reason")!=="off";return ba(t,{documents:n??e.fileDocuments,requireReason:r,allowInline:o.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function Cn(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 va(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,o=[],r=[];for(let i of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===i.uri&&a.code===i.code&&a.messageHash===Cn(i.message)&&a.range?.start?.line===i.range?.start?.line&&a.range?.start?.character===i.range?.start?.character);if(s>=0){n.add(s),r.push(i);continue}o.push(i)}return{diagnostics:o,baselineDiagnostics:r,staleEntries:e.input.baseline.diagnostics.filter((i,s)=>!n.has(s))}}var Sa={error:0,warning:1,info:2};function xa(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function In(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let r=t.range?.start.offset??-1,i=n.range?.start.offset??-1;if(r!==i)return r-i;let s=Sa[t.severity]-Sa[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function ka(e,t,n){let o=t.filter(i=>!i.skipped),r=In([n,o.flatMap(i=>i.diagnostics)]);return{files:o.length,errors:r.filter(i=>i.severity===h.Error).length,warnings:r.filter(i=>i.severity===h.Warning).length,infos:r.filter(i=>i.severity===h.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function vp(e,t){return e.map(({path:n,uri:o,kind:r,diagnostics:i,rawDiagnostics:s,skipped:a,skipReason:l})=>({path:n,uri:o,kind:r,diagnostics:i,rawDiagnostics:t?s:void 0,skipped:a,skipReason:l}))}function Ra(e,t){let n=In([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(o=>o.diagnostics)??[]]);return{ok:!xa(n,e.input.maxWarnings),files:e.files?vp(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var Sp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},xp={unused:u.UnusedSuppression,"missing-reason":u.MissingSuppressionReason};function kp(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Rp(e,t){return kp(Pt(e.linter.rules,t))}function lr(e){let t=[];for(let n of e.issues){let o=Sp[n.kind],r=Rp(e.config,o);if(!r)continue;let i=E(xp[n.kind],r,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...i,rule:o})}return t}async function Tp(e){let t=await pa(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=ya(t);let o=ar(t,n);n=[...o.diagnostics,...lr({issues:o.issues,config:t.resolvedConfig})];let r=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=ee(t.resolvedConfig,d.path),m=ar(t,d.diagnostics,[c],p);d.diagnostics=[...m.diagnostics,...lr({issues:m.issues,config:p})],d.rawDiagnostics=[...d.diagnostics],r+=m.suppressedDiagnostics.length}let i=0,s=[];for(let l of t.files){if(l.skipped||l.diagnostics.length===0)continue;let d=va(t,l.diagnostics);l.diagnostics=d.diagnostics,i+=d.baselineDiagnostics.length,d.staleEntries.length>0&&(s=s.concat(d.staleEntries))}t.files=ua(t.files),t.finalProjectDiagnostics=n;let a=ka(t,t.files,n);return a.suppressed=r,a.baselineFiltered=i,a.staleEntries=s,{...Ra(t,a),files:t.files??[]}}async function yt(e){let t=e.project,n=e.host??t.host,o=e.documents,r=e.externalModelDocuments,i=e.augmentations,s=[...e.projectDiagnostics??[]];if(!o||!r||!i){let a=await H(e.project,n);o??=a.documents,r??=a.externalModelDocuments,i??=a.augmentations,s=[...s,...a.diagnostics]}return Tp({...e,host:n,documents:o,externalModelDocuments:r,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}import{z as X}from"zod";var En=X.object({version:X.literal(1),diagnostics:X.array(X.object({path:X.string(),code:X.string(),messageHash:X.string(),range:X.object({start:X.object({line:X.number(),character:X.number(),offset:X.number()}).strict(),end:X.object({line:X.number(),character:X.number(),offset:X.number()}).strict()}).strict().optional()}).strict())}).strict();function dr(e){return{path:e.uri,code:e.code,messageHash:Cn(e.message),range:e.range}}function cr(e){return e.linter.baseline}function Ta(e){return[...e.files.values()]}function Da(e){return[...e.reachableDocuments.values()]}function Ca(e){return e.workspace}function Ia(e){return[...e.nodeDefinitionModels]}function Ea(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})),r=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)r.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let i=[...n];return i.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:i,edges:o,issues:r}}async function nt(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=e.host??t.host,r=e.documents,i=e.externalModelDocuments,s=e.augmentations,a=[];if(!r||!i||!s){let d=await H(e.project,o);a.push(...d.diagnostics),r??=d.documents,i??=d.externalModelDocuments,s??=d.augmentations}let l=await sr({project:e.project,documents:r,activeDocumentUris:new Set(r.map(d=>d.uri)),externalModelDocuments:i,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:o});return a.push(...l.diagnostics),{ok:l.ok,diagnostics:a,semanticIndex:Ca(l.index),documents:Ta(l.index),reachableDocuments:Da(l.index),nodeDefinitionModels:Ia(l.index),includeGraph:Ea(l.index)}}function ur(e){return e.map(t=>({...t,absolutePath:ne(t.uri)}))}function le(e){return ne(Ho(e))}function pr(e){let t=Jo(e);return t?ne(t):void 0}function J(e){return ur(Zo(e))}function xe(e){return ur(Qo(e))}function ot(e){return ur(er(e))}import fr from"fs";import Na from"path";import{createColors as Cp}from"picocolors";function wn(e){return e.noColor?{enabled:!1}:e.env?.NO_COLOR!==void 0?{enabled:!1}:e.stream&&!e.stream.isTTY?{enabled:!1}:{enabled:!0}}function oe(e,t,n){let o=Cp(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 mr(e){let t=wn({noColor:e.noColor,stream:e.stream,env:process.env}),n=[];if(n.push(`${oe(t,"error","error:")} ${e.message}`),e.help&&(n.push(""),n.push(`${oe(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(`
|
|
20
|
-
`)}var F=class extends Error{constructor(n,o,r
|
|
21
|
-
note: ${String(e.message||e)}`),3)}function
|
|
22
|
-
`,"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 jo(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 Fo(e,t,n){let o=t.valueContentRange??t.valueRange,i=jo(t,n.start),r=jo(t,n.end),s=$(e.originalText,o.start.offset+i),a=$(e.originalText,o.start.offset+r);return I(s,a)}function Qr(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function es(e,t){return e.includeIssuesByUri.get(t)??[]}function ts(e,t){return e.suppressionIssuesByUri.get(t)??[]}function ns(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=iu(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=es(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getSuppressionIssues(d){let c=ts(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getNodeUsage(d){return Ae(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 Ot(n,{id:d,fileLocalUri:c,config:o})},getNodeModel(d){return _e(n,d)},getBehaviorTrees(d){return Se(n,d)},getTreeNodeView(d){return r.get(d)},getSubTreeCallView(d){return s.get(d)}}}function iu(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return Lo(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||Lo(n,t);return t}function Lo(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&Lo(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 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 Le(e){return C({name:ru[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:su(n)})}}}})}function su(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 os=[Le("missing-path"),Le("not-found"),Le("cycle"),Le("outside-root"),Le("unresolved-variable"),Le("depth-exceeded"),Le("too-many-files"),Le("external-used")];import au from"ajv";var lu=au,du=new lu,cu=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],uu={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}},Oo=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"]),is=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 rs(e){return e.children.filter(t=>t.kind==="element")}function ye(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function ss(e){return e.children.some(t=>t.kind==="element")}function Rn(e,t){let n=as(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function as(e){let t=Xt(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 yu(e.registry,n,e.value)?void 0:kn(e.diagnosticCode,e.value,e.portLabel);let o=e.typeDefinition?.canonical??e.port.type;if(o&&!ds(o,e.value))return pu(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 Ke(e){return e.effectiveType??e.type}function ls(e,t){return fe(e,Ke(t))}function Xt(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 pu(e){let t=Nt(e)??e;return cs(e)!==void 0||hu.has(t.toLowerCase())}function ds(e,t){let n=cs(e);if(n)return mu(n,t);let o=(Nt(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 cu.includes(t);default:return Oo.has(o)||is.has(o)?us(o,t):!1}}function cs(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function mu(e,t){let n=gu(t);return n?n.every(o=>fu(e,o)):!1}function fu(e,t){if(t.kind==="string")return ds(e,t.value);let n=(Nt(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 Oo.has(n)||is.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&us(n,String(t.value)):!1}}function us(e,t){let n=uu[e];if(!n)return!1;if(Oo.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 gu(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 yu(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?as({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 du.compile(t.schema)(o)===!0}catch{return!1}}}var hu=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 ps=[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=io(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 Lt(e.semantic))t.uri&&t.uri!==e.document.uri||bu(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(!vu(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=Su(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"){Xt(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=Xt(r.name,r.value);if(!s)continue;let a=ls(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:Ru(i.element),port:r.declaredPort.port,typeDefinition:a,range:r.attribute.range}),n.set(l,d)}for(let i of n.values()){let r=xu(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 ${ku(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(Du(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"&&Xt(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 bu(e,t){return e.diagnostics.some(n=>n.code===u.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function vu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Su(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 xu(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")||mt(e,r.typeDefinition.canonical,a.typeDefinition.canonical)||(o.add(r.typeDefinition.canonical),o.add(a.typeDefinition.canonical)))}}return[...o].sort()}function ku(e,t){return Ke(e)??t.canonical}function Ru(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Du(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Tu=new Set(["_failureIf","_successIf","_skipIf","_while"]),Iu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Uo(e){if(Tu.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Iu.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 $o(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 ms=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),fs=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function gs(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(ys(o)){n++;continue}if(qo(o)){let a=n;for(n++;n<e.length&&Nu(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(He(o)){let a=Eu(e,n);t.push(a),n=a.end;continue}if(o==="'"){let a=Cu(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),r=ms.get(i);if(r){t.push({type:r,text:i,start:n,end:n+2}),n+=2;continue}let s=fs.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 Cu(e,t){let n=t+1;for(;n<e.length&&e[n]!=="'";)n++;return n>=e.length?{type:"Error",text:e.slice(t),start:t,end:e.length}:{type:"String",text:e.slice(t+1,n),start:t,end:n+1}}function Eu(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let i=n;for(;n<e.length&&Mu(e[n]);)n++;return i===n||Pu(e,n)?(n=Gt(e,n),zt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&He(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(!He(e[n+1]))return n=Gt(e,n+1),zt(e,t,n);for(o="Real",n+=1;n<e.length&&He(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let r=n;for(;n<e.length&&He(e[n]);)n++;if(r===n)return n=Gt(e,Math.max(n,i+1)),zt(e,t,n);o="Real"}return wu(e,n)?(n=Gt(e,n),zt(e,t,n)):{type:o,text:e.slice(t,n),start:t,end:n}}function Gt(e,t){let n=t;for(;n<e.length;){let o=e[n];if(ys(o)||fs.has(o)||ms.has(e.slice(n,n+2))||o==="."&&e[n+1]===".")break;n++}return n}function zt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ys(e){return e===" "||e===" "||e===`
|
|
19
|
+
`||e==="\r"}function qo(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Nu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function He(e){return e!==void 0&&/[0-9]/.test(e)}function Mu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function wu(e,t){let n=e[t];return qo(n)||He(n)}function Pu(e,t){let n=e[t];return n==="."||qo(n)||He(n)}var Bu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),_u=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),hs=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 Kt(e){let t=gs(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}:bs(t,e)}function bs(e,t=""){let n=new Vo(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=Ou(o);return{ok:!0,program:{kind:"Program",statements:o,range:i},tokens:e}}var Vo=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=Bu.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:Wt(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:Wt(n.range,d.range)};break}let r=hs.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=hs.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:Wt(l[0].range,l[l.length-1].range)};continue}let s=_u.get(o.type),a=s?Fu(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:Je(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),Au(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:ju(t.type),argument:n,range:Wt(Je(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(),Lu(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:Je(o)})}};function Au(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:Je(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Je(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Je(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Je(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function ju(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Fu(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 Je(e){return{start:e.start,end:e.end}}function Wt(e,t){return{start:e.start,end:t.end}}function Lu(e,t){return{...e,range:t}}function Ou(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Uu=new Set(["int8_t","std::int8_t","int16_t","std::int16_t","int32","int32_t","std::int32_t","int64","int64_t","std::int64_t","int","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint32","uint32_t","std::uint32_t","uint64","uint64_t","std::uint64_t","uint","unsigned","unsigned int","size_t","std::size_t","float","double"]);function Xo(e={}){let t=dt(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>Mt(t,s,a)),o=new Map,i=new Map,r={symbols:new Map,globalBlackboard:new Map,enums:$u(e.enums,e.augmentations??[])};for(let s of e.symbols??[])vs(r.symbols,o,s,n);for(let s of e.globalBlackboardSymbols??[])vs(r.globalBlackboard,i,s,n);return r}function Ye(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 Go(e){let t=Ye(e.baseEnvironment),n=[];for(let o of e.entries){let i=Ye(t),r=o.parseResult??Kt(o.source),s=Ye(i),a;r.ok&&(a=Jt({program:r.program,environment:i,attributeName:o.attributeName,originId:o.originId??String(o.id)}),s=Ye(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 Ss(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 Ht(e,t){let n=fe(e,t);return xs(t,n)}function xs(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:Uu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function ks(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 bt(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 Ze(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function zo(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 $u(e,t){if(e instanceof Map)return new Map(e);let n=Ss(t??[]);for(let[o,i]of Object.entries(e??{}))n.set(o,i);return n}function vs(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)||!ks(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 Qe={kind:"number"},Tn={kind:"string"},Dn={kind:"bool"},le={kind:"unknown"},U={kind:"error"};function Jt(e){let t=Ye(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"?Qe:t.valueKind==="string"?Tn:t.valueKind==="boolean"?Dn:le;case"Identifier":return Vu(e,t.name,t.range);case"UnaryExpression":{let n=xe({...e,expression:t.argument});return t.operator==="!"?Ze(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"?Qe: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 Ds(n)||Ds(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"?Qe:Wo(n,o)?le:(Ko(e,t.range,t.operator),U);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&o.kind==="number"?Qe:Wo(n,o)?le:(Ko(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:Wo(n,o)?le:(Ko(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(!Xu(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});Ze(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=zo(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 qu(e)}}function qu(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=$o(a.name);if(c.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(d),Ts(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&&bt(f.type,s)?s:f?void 0:s:Rs(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&&!bt(f.type,s))return Ho(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 bt(p.type,s)?(Jo(p,s),s):(Ho(e,a,p.type,s),U);if(r.operator===":=")return bt(p.type,s)?(Jo(p,s),s):(Ho(e,a,p.type,s),U);let m=Rs(p.type,s,r.operator);return m?(Jo(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 Vu(e,t,n){let o={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(o);let i=$o(t);if(i.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(o),Ts(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}}),Qe;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 Rs(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"?Qe:e.kind==="string"&&t.kind==="string"?Tn:void 0:e.kind==="number"&&t.kind==="number"?Qe:void 0}function Wo(e,t){return In(e)||In(t)}function In(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Ds(e){return!Ze(e)}function Xu(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 Ko(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 Ho(e,t,n,o){ee(e,"variable-type-mismatch",t.range,`cannot assign ${Yo(o)} to variable \`${t.name}\` of type ${Yo(n)}`,`\`${t.name}\` expects ${Yo(n)} here`,"assign a compatible value or change the variable's source type")}function Ts(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 Jo(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 Yo(e){return e.kind==="custom"?e.name:e.kind}var Is=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=Uo({elementName:t.name,attributeName:i.name,resolvedNodeType:o});return r?[{attribute:i,info:r,parseResult:Kt(i.value)}]:[]})}function he(e,t,n){return Fo(e.document,t,n)}function Cs(e){return{start:0,end:e.value.length}}function Oe(e,t){let n=e.getTreeNodeView(t),o=n?.behaviorTree;return!n||!o?Cn(e,t).map(i=>{let r=Es(e,[]);return{...i,environment:r,analysis:i.parseResult.ok?Jt({program:i.parseResult.program,environment:r,attributeName:i.attribute.name}):void 0}}):Gu(e,o).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function Gu(e,t){let n=Is.get(e.view);n||(n=new WeakMap,Is.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=Go({baseEnvironment:Es(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 Es(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=Ke(a),c=ve(e.semantic,l)?.canonical??l;o.push({name:a.name,type:Ht(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=Ke(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:Ht(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(...zu(e,n)),Xo({symbols:o,globalBlackboardSymbols:i,augmentations:Co(e.semantic),areTypesCompatible:(s,a)=>s&&a?mt(e.semantic,s,a):!0})}function zu(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=Ke(r.usage.port),d=ve(e.semantic,a)?.canonical??a,c=r.usage.port.direction;n.push({name:s.reference.key,type:Ht(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 Ns=C({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: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 Ms=C({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:he(e,n.attribute,o.range),details:o.details})}}}}});var ws=C({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:he(e,n.attribute,o.range),details:o.details})}}}});var Ps=C({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||Ze(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 Bs=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,Cs(n.attribute)):he(e,n.attribute,o.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var _s=[Bs,Ns,Ms,ws,Ps];var Wu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function As(e){return C({name:Wu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Ku(n)})}}}})}function Ku(e){return e.code?{code:e.code}:void 0}var js=[As("unused"),As("missing-reason")];function En(e,t){return e.attributes.find(n=>n.name===t)}function Fs(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 Ls=[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=jt(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 ft(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||xo(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"||Fs(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"||Fs(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 Hu=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Ju(e,t){return e===t?String(e):`${e}\u2013${t}`}var Os=C({name:"model/valid-child-count",create(e){return{Element(t){if(ye(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Yu(e,t,n.model.model.id,n.model.model.kind)}}}});function Yu(e,t,n,o){let i=rs(t).length,r=Hu.get(n);if(r){if(i<r.min||i>r.max){let s=Ju(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 Us=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 $s=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 qs=[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||ss(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 Vs=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 Xs=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 Gs=[Vs,Xs,$s,Us,...qs,Os];function Zu(e,t){return e.attributes.find(n=>n.name===t)}function Qu(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var zs=[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||Zu(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)||Qu(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Zo=[...zs,..._s,...Ls,...ps,...Gs,...os,...js],Sv=new Map(Zo.map(e=>[e.name,e]));function Ws(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Ks(e,t){return Ne(e.linter.rules[t])?.options??{}}function Hs(e){let t=Ne(e.config.linter.rules[e.rule]);return Ws(t?t.severity:e.defaultSeverity)}function Js(e){let t=[],n=e.facts??Qr(),o=e.rules?new Set(e.rules):void 0,i=[];for(let s of Zo){if(o&&!o.has(s.name))continue;let a=Hs({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=Ks(e.config,s.name),d=s.optionsSchema?.safeParse(l),c=d?.success?d.data:l,p=ns({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&&Ys(e.document.root,i);let r=jt(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)=>ep(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Ys(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Ys(n,t)}function ep(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 Qo(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:be(n.config)});return o.push(...Js({document:e,view:i,semantic:t,config:n.config})),o}import ci from"path";function tp(e){return e.endsWith("/")?e:`${e}/`}function np(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):ei(e.split("/"))}function ei(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function et(e,t={}){let n=e.replace(/\\/g,"/"),o=s=>np(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=ei(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 op(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Yt(e){return Nn(et(e))}function ip(e,...t){let n=et(e),o=[...n.segments];for(let i of t){let r=et(i,{preserveDotSegments:!0});if(r.scheme||r.absolute&&r.authority)return Yt(i);r.absolute&&(o.length=0),o.push(...r.segments)}return Nn({...n,segments:ei(o)})}function rp(e){let t=et(e);return t.segments.length===0?Nn(t):Nn({...t,segments:t.segments.slice(0,-1)})}function sp(e){return et(e).segments.at(-1)??""}function ap(e,t){let n=et(e),o=et(t);if(!op(n,o))return Yt(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 lp(e,t){let n=tp(Yt(e)),o=Yt(t);return o===n.slice(0,-1)||o.startsWith(n)}var K={normalize:Yt,join:ip,dirname:rp,basename:sp,relative:ap,isWithin:lp};function ke(e,...t){return K.join(e,...t)}function Zs(e){return K.dirname(e)}function Qs(e){return K.basename(e)}function Ue(e,t){return K.relative(e,t)}function ea(e,t){return K.isWithin(e,t)}async function oa(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 dp(e,t){return oa(e,["btxml.config.json"],t)}async function ta(e,t){return JSON.parse(await t.readFile(e))}function na(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 ia(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await dp(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 ta(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 oa(e.startUri,["package.json"],e.host);if(r)try{let s=await ta(r,e.host);s.btxml&&(n=s.btxml,t=r)}catch{n={}}}let o=ut(n);if(!o.ok)return{ok:!1,configUri:t,diagnostics:na(o.diagnostics,t)};let i=yo(o.value);return i.length>0?{ok:!1,configUri:t,diagnostics:na(i,t)}:{ok:!0,config:o.value,configUri:t,diagnostics:[]}}import cp from"ignore";function ti(e){return e.replace(/\\/g,"/")}function V(e,t){return ti(Ue(e,t))}function up(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 $e(e,t){let n=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||Qs(n)===o:up(o).test(n)}function pp(e){return e.includes("*")||e.includes("?")}async function ra(e,t,n,o,i,r,s,a){let l=V(n,t);if(l&&o.some(c=>$e(l,c)||$e(`${l}/`,c)||$e(`${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 ra(e,p,n,o,i,r,s,a):f&&i.push(p)}}async function Zt(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=>$e(y,S))&&(!g||!r?.ignores(y))&&a.add(f);continue}if(!pp(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 ra(s,t,t,n,p,o,m,r)}for(let m of p){let f=V(c,m);d.some(y=>$e(f,y))&&(n.some(y=>$e(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 $e(g,m)&&!n.some(S=>$e(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 mp(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 fp(e){return cp().add(e)}async function sa(e,t,n,o,i){let r=[...t.ignore],s=t.useGitignore?await mp(e,i):[],a=fp(s),l=n?.length?n:t.include,d=await Zt(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 aa(e){return e.entrypoints.map(t=>({file:ti(t)}))}function ni(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function la(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 da(e,t,n,o){let i=await Zt(t.files,e,[],n.followSymlinks,void 0,void 0,o),r=await Zt(t.definitions,e,[],n.followSymlinks,void 0,void 0,o),s=await Zt(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 oi(e){return e.rootUri}function ii(e){return e.configUri}function ri(e){return e.config}function tt(e){return e.resolvedConfig}function si(e){return e.selectedFiles.map(t=>({...t}))}function ai(e){return e.modelFiles.map(t=>({...t}))}function li(e){return e.definitionFiles.map(t=>({...t}))}function di(e){return e.skippedFiles.map(t=>({...t}))}async function gp(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 ca(e){let t=await ia({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 gp({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:r,skippedFiles:s}=await sa(i,o.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?V(i,t.configUri):"",d=aa(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 da(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 la(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 bp}from"fs";import Qt from"fs/promises";import vp from"path";import ua from"path";import{fileURLToPath as yp,pathToFileURL as pa}from"url";function hp(e){return e.startsWith("file://")?e:pa(ua.resolve(e)).href}function te(e){return yp(hp(e))}function nt(e){return pa(ua.resolve(e)).href}function Sp(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Me(e=process.cwd(),t={}){let n=vp.resolve(e),o=nt(n);return{rootUri(){return o},async readFile(i){return Qt.readFile(te(i),"utf8")},async exists(i){try{return await Qt.access(te(i),bp.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(i){try{let r=await Qt.stat(te(i));return{type:Sp(r),size:r.size}}catch{return}},async readDir(i){return(await Qt.readdir(te(i),{withFileTypes:!0})).map(s=>({name:s.name,type:s.isFile()?"file":s.isDirectory()?"directory":"other"}))},async realpath(i){return nt(await Qt.realpath(te(i)))},async resolvePackageUri(i){return t.resolvePackageUri?.(i)}}}async function ui(e={}){let t=ci.resolve(e.cwd??process.cwd()),n=e.projectRoot?ci.resolve(t,e.projectRoot):t,o=Me(n,e.hostOptions);return ca({rootUri:nt(n),host:o,configUri:e.configPath?nt(ci.resolve(t,e.configPath)):void 0,noConfig:e.noConfig,cliFiles:e.cliFiles,command:e.command})}var ma={InvalidJson:u.InvalidAugmentationJson,InvalidSchema:u.InvalidAugmentationSchema};function xp(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 kp(e,t){return t.issues.map(n=>xp({filePath:e,code:n.kind==="json"?ma.InvalidJson:ma.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=uo(s,{uri:r.uri,path:r.path});if(!a.ok){o.push(...kp(r.path,a));continue}i.push(a.data)}return{ok:o.every(r=>r.severity!==h.Error),augmentations:i,diagnostics:o}}function Rp(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 Dp(e,t){return Fe(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function pi(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 Dp(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=Rp(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=Fe(c,{uri:d.uri,path:d.path});p.document&&i.push(p.document)}let r=await Promise.all(n.modelFiles.map(d=>pi(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 fa(e,t){return e.attributes.find(n=>n.name===t)}function ga(e,t){return Ue(e,t).replace(/\\/g,"/")}function Tp(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 Ip(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:fa(r,s.pathAttribute),rosPackageAttr:fa(r,"ros_pkg"),base:s.base??"current-file"})}return i}async function ya(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=>[ga(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=Fe(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 Ip(P,e)){if(!A.pathAttr){s.push({kind:"missing-path",uri:B,range:A.element.range,message:"missing include path"});continue}let Pe=Tp(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:Pe,range:A.rosPackageAttr.range,message:`ROS package \`${w}\` could not be resolved for include path \`${Pe}\``});continue}re=ke(E,Pe)}else{let w=A.base==="project-root"?t.rootUri:Zs(D);re=ke(w,Pe)}let O=ga(t.rootUri,re),me=re;try{await n.exists(re)&&(me=n.realpath?await n.realpath(re):re)}catch{}if(!ea(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 \`${Pe}\``})}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 ha="model/no-conflicting-kind-for-id",ba="model/no-unused-definition",va="model/no-duplicate-definition";function mi(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 fi(e,t){let n=We(e.linter.rules,t);if(n!=="off")return n==="info"?h.Info:n==="warn"?h.Warning:h.Error}function en(e){return e.model.idRange??e.range}function wn(e){return e.range}function Cp(e){return{uri:e.uri,sourceKind:e.sourceKind,modelKind:e.kind,range:e.range}}function Ep(e){let t=fi(e.config,ha);if(!t)return[];let n=[],o=$t(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=en(a),c=a.uri&&d?[{uri:a.uri,range:d,message:"first conflicting definition"}]:void 0;n.push(mi({code:"BT120_CONFLICTING_MODEL_KIND",message:`model ID \`${i}\` has conflicting kinds (\`${a.kind}\` vs \`${l.kind}\`)`,uri:l.uri,range:en(l),rule:ha,severity:t,data:{kind:"conflicting-model-kind",nodeId:i,definitions:r.map(Cp)},relatedInformation:c}))}}return n}function Np(e){if(e.config.models.convention!=="used-only")return[];let t=fi(e.config,ba);if(!t)return[];let n=[],o=ko(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(mi({code:"BT121_UNUSED_MODEL_DEFINITION",message:`unused inline model definition \`${i.id}\` in this file`,uri:i.uri,range:en(i),rule:ba,severity:t,data:{kind:"unused-model-definition",nodeId:i.id,modelKind:i.kind,sourceKind:"inline-tree-nodes-model",fix:i.uri&&wn(i)&&i.editable?{kind:"delete-definition",uri:i.uri,range:wn(i)}:void 0}}))}return n}function Mp(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||!wn(i)||!i.editable))return{kind:"delete-non-canonical-definitions",keep:{uri:n.uri,range:en(n)},delete:o.map(i=>({uri:i.uri,range:wn(i)}))}}function wp(e){if(e.config.models.convention!=="single-source")return[];let t=fi(e.config,va);if(!t)return[];let n=[],o=Bo(e.facts.filter(i=>!i.isBuiltin));for(let i of o.values()){if(i.length<=1)continue;let r=i[0];r&&n.push(mi({code:"BT122_DUPLICATE_MODEL_DEFINITION",message:`duplicate model definition for \`${r.id}\` (${r.kind})`,uri:r.uri,range:en(r),rule:va,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:Mp(i)}}))}return n}function Sa(e){if(e.config.linter.enabled===!1)return[];let t=Ut(e.index);return[...Ep({config:e.config,facts:t}),...Np({config:e.config,index:e.index,facts:t}),...wp({config:e.config,facts:t})]}import{findNodeAtLocation as xa,parse as Pp,parseTree as Bp}from"jsonc-parser";function _p(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 ka(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function Ra(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=Bp(l,d,{allowTrailingComma:!0,disallowComments:!1});try{if(a=Pp(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=po.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=_p(l),g=ka(xa(c,["nodes",m]),y),S=Ct(m,f),v=S.ports.map(x=>{let D=ka(xa(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 Da(e,t){return Ue(e,t).replace(/\\/g,"/")}function Ap(e){return[...e.reachableDocuments.values()]}function gi(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function Ta(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function jp(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 yi(e){let t=[],n=e.project,o=e.resolvedConfig,i=e.resolutionMode??ni(o),r=i==="entrypoints"||e.resolveGraph?await ya({project:e.project,documents:e.documents,resolvedConfig:o,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await Ra({project:e.project,host:e.host});t.push(...l.diagnostics);let d=l.nodeModels,c=r&&(i==="entrypoints"||e.resolveGraph)?gi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)&&r.reachableUris.has(g.uri)),...r.reachableDocuments.values(),...s]):gi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)),...s]),p=At(c,{config:o,models:d,augmentations:a}),m={includeIssuesByUri:jp(r?.issues??[]),suppressionIssuesByUri:new Map};t.push(...p.diagnostics,...Sa({config:o,index:p.index}));let f=new Map(ft(p.index).map(g=>[g,Se(p.index,g)])),y={mode:i,files:new Map(c.map(g=>[Da(n.rootUri,g.path||g.uri),g])),documentViews:new Map(c.map(g=>[g.uri,(()=>{let S=Q(o,Da(n.rootUri,g.path||g.uri));return je(g,{semantic:p.index,config:S,policy:be(S)})})()])),includeGraph:r?.graph,reachableDocuments:r?.reachableDocuments??new Map,behaviorTreesById:new Map(ft(p.index).map(g=>[g,Se(p.index,g)])),reachableBehaviorTreesById:f,nodeModelsById:new Map(Do(p.index).map(g=>[g.id,g])),nodeModelSources:new Map(To(p.index).map(g=>[g,Ft(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 Ia(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 pi(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??ni(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 yi({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:r,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:i}),c=gi([...e.documents,...Ap(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 Fp={"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 Ca(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Lp(e,t){let n=Ne(e.linter.rules[t]);return Ca(n?n.severity:W[t].defaultSeverity)}function Op(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 Ea(e){let t=[];for(let n of e.issues){let o=Fp[n.kind],i=Lp(e.config,o);if(!i)continue;let r=T(W[o].code,i,n.message,n.range,n.uri,void 0,Op(n));t.push({...r,rule:o})}return t}function Na(e,t){return Ue(e,t).replace(/\\/g,"/")}function Up(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function $p(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let o=Na(e,n);if(Up(o))return o}return Na(e,t.uri)}function Ma(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=$p(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"?At([d,...o],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,m=l==="single-file"?(()=>{let y=Q(s,c);return je(d,{semantic:p,config:y,policy:be(y)})})():n.index.documentViews.get(d.uri),f=[];if(r){let y=Q(s,c);f=Qo(d,p,{config:y,documentView:m});let g=n.index.facts.includeIssuesByUri.get(d.uri)??[];f.push(...Ea({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 wa(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...wa(n.children));return t}function qp(e,t,n){let o=[],i=[];for(let r of e){let s=wa(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 Pa(e,t){let n=qp(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 hi(e,t,n,o=e.resolvedConfig){let i=We(o.linter.rules,"suppression/require-reason")!=="off";return Pa(t,{documents:n??e.fileDocuments,requireReason:i,allowInline:o.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function Pn(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 Ba(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===Pn(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 Aa(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function Bn(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 ja(e,t,n){let o=t.filter(r=>!r.skipped),i=Bn([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 Vp(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 Fa(e,t){let n=Bn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(o=>o.diagnostics)??[]]);return{ok:!Aa(n,e.input.maxWarnings),files:e.files?Vp(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var Xp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},Gp={unused:u.UnusedSuppression,"missing-reason":u.MissingSuppressionReason};function zp(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Wp(e,t){return zp(We(e.linter.rules,t))}function bi(e){let t=[];for(let n of e.issues){let o=Xp[n.kind],i=Wp(e.config,o);if(!i)continue;let r=T(Gp[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 Kp(e){let t=await Ia(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=Ma(t);let o=hi(t,n);n=[...o.diagnostics,...bi({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=hi(t,d.diagnostics,[c],p);d.diagnostics=[...m.diagnostics,...bi({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=Ba(t,l.diagnostics);l.diagnostics=d.diagnostics,r+=d.baselineDiagnostics.length,d.staleEntries.length>0&&(s=s.concat(d.staleEntries))}t.files=Ta(t.files),t.finalProjectDiagnostics=n;let a=ja(t,t.files,n);return a.suppressed=i,a.baselineFiltered=r,a.staleEntries=s,{...Fa(t,a),files:t.files??[]}}async function vt(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 Kp({...e,host:n,documents:o,externalModelDocuments:i,augmentations:r,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}import{z as G}from"zod";var _n=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 vi(e){return{path:e.uri,code:e.code,messageHash:Pn(e.message),range:e.range}}function Si(e){return e.linter.baseline}function La(e){return[...e.files.values()]}function Oa(e){return[...e.reachableDocuments.values()]}function Ua(e){return e.workspace}function $a(e){return[...e.nodeDefinitionModels]}function qa(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 ot(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 yi({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:Ua(l.index),documents:La(l.index),reachableDocuments:Oa(l.index),nodeDefinitionModels:$a(l.index),includeGraph:qa(l.index)}}function xi(e){return e.map(t=>({...t,absolutePath:te(t.uri)}))}function de(e){return te(oi(e))}function ki(e){let t=ii(e);return t?te(t):void 0}function J(e){return xi(si(e))}function Re(e){return xi(ai(e))}function it(e){return xi(li(e))}import Di from"fs";import Xa from"path";import{createColors as Jp}from"picocolors";function An(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=Jp(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 Ri(e){let t=An({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 F=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 Va(e){return e instanceof F?(console.error(Ri({message:e.message,help:e.help,expected:e.expected})),e.exitCode):(console.error(Ri({message:"command failed"})),console.error(`
|
|
22
|
+
note: ${String(e.message||e)}`),3)}function Ti(e,t){let n=t.baseline||Si(tt(e)||ri(e));if(!n||t.noBaseline)return;let o=Xa.resolve(de(e),n);if(!Di.existsSync(o))return;let i;try{i=JSON.parse(Di.readFileSync(o,"utf8"))}catch{throw new F(`failed to read baseline file: ${o}`,2)}let r=_n.safeParse(i);if(!r.success)throw new F(`invalid baseline file: ${o}`,2,r.error.issues[0]?.message);return r.data}function Ii(e,t,n){let o=t.updateBaseline;if(!o||t.noBaseline)return;let i=Xa.resolve(de(e),o),r={version:1,diagnostics:n.map(s=>vi(s))};Di.writeFileSync(i,`${JSON.stringify(r,null,2)}
|
|
23
|
+
`,"utf8"),t.quiet||console.log(`Baseline updated: ${o}`)}import Qp from"fs";import{z as De}from"zod";var St=De.object({config:De.string().optional(),projectRoot:De.string().optional(),noConfig:De.boolean().optional(),quiet:De.boolean().optional(),verbose:De.boolean().optional(),noColor:De.boolean().optional()}).passthrough(),Te=De.object({files:De.array(De.string()).default([])});function z(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 F(`--${i} requires a value`,2);if(typeof r=="string")throw new F(`invalid value \`${r}\` for \`--${i}\``,2)}throw new F(o?.message||"invalid options",2)}import{z as qe}from"zod";import{z as Ga}from"zod";var Yp=Ga.enum(["human"]),tn=Ga.enum(["human","json"]),za=Yp.default("human"),ce=tn.default("human");var Ie=St.transform(e=>{let{config:t,...n}=e;return{...n,configPath:t}});var Wa=Ie.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:ce,json:qe.boolean().optional()}).merge(Te).transform(e=>({...e,output:e.json?"json":e.output})));var Ka={error:0,warning:1,info:2};function jn(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function xt(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=Ka[t.severity]-Ka[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function Ha(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,M="^".repeat(Math.max(1,v)),B=ne(r,i==="error"?"error":i==="warning"?"warning":"info",M),A=o?` ${ne(r,"dim",o)}`:"";return s.push(" ".repeat(c)+p+" ".repeat(D)+B+A),s.push(" ".repeat(c)+p.trimEnd()),s}function Ve(e){let t=An({noColor:e.noColor,stream:e.stream,env:process.env}),n=xt([e.diagnostics]),o=[];for(let i of n)o.push(Zp(i,e.defaultPath,e.sourceTextByUri,t));return o.join(`
|
|
23
24
|
|
|
24
|
-
`)}function
|
|
25
|
-
`)}var
|
|
26
|
-
`,"utf8"),console.log(`Created ${t}`),{ok:!0}}var
|
|
27
|
-
`)} `),
|
|
28
|
-
`)}}finally{t.close()}}function dl(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 cl(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(i=>[i.name,i])),r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of o)r.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:dl(s)});for(let[i,s]of r)o.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:dl(s)});for(let[i,s]of o){let a=r.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function Y(e){return e==null?"undefined":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.sort().join(";")||"empty":String(e)}function vr(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 jp(e){return"portName"in e}function Sr(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(jp).map(o=>o.portName));if(n.size===1){let o=Array.from(n)[0];return`${t.map(i=>i.kind.replace("port-","")).join(", ")} on \`${o}\``}return`${n.size} differing ports`}function pl(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 Fp(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 Lp(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 ul(e){return`${e.kind} ${e.id}(${e.ports.map(Lp).join(", ")})`}function ml(e){let t=new Map;for(let r of e){let i=Fp(r),s=t.get(i)??[];s.push(r),t.set(i,s)}let n=Array.from(t.entries());n.sort((r,i)=>{let s=r[1][0],a=i[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(([r,i],s)=>{let a=o[s]??`S${s}`,l=i[0],d=i.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:r,signatureId:a,signatureText:ul(c),model:c}));return{id:a,signatureKey:r,signatureText:ul(l),kind:l.kind,definitions:d,editableDefinitions:d.filter(c=>c.model.editable!==!1),nonEditableDefinitions:d.filter(c=>c.model.editable===!1)}})}function Op(e){return/^\{[^}]+\}$/.test(e.trim())}function $p(e){return e.name==="SubTree"?e.attributes.find(n=>n.name==="ID")?.value??e.name:e.name}function fl(e,t,n,o){let r=0;if($p(e)===t){r++;for(let i of n){let s=o.get(i);s||(s={providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0},o.set(i,s));let a=e.attributes.find(l=>l.name===i);a?(s.providedCount++,Op(a.value)?s.blackboardReferenceCount++:s.literalValues[a.value]=(s.literalValues[a.value]||0)+1):s.omittedCount++}}for(let i of e.children)i.kind==="element"&&(r+=fl(i,t,n,o));return r}function xr(e){let t=new Map,n=0;for(let r of e.documents)if(r.root)for(let i of r.root.children)i.kind==="element"&&i.name==="TreeNodesModel"||i.kind==="element"&&(n+=fl(i,e.nodeId,e.candidatePorts,t));let o={};for(let r of e.candidatePorts)o[r]=t.get(r)||{providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0};return{nodeId:e.nodeId,totalUsages:n,byPort:o}}function On(e){let t={signatureId:e.signature.id,newMissingRequiredPorts:[],removedPortsUsedByUsages:[],directionChanges:[]},n=new Set(Object.keys(e.usageEvidence.byPort));for(let o of n){let r=e.usageEvidence.byPort[o],i=e.signature.definitions[0]?.model.ports.find(s=>s.name===o);i?.required&&r.omittedCount>0&&t.newMissingRequiredPorts.push({portName:o,omittedCount:r.omittedCount}),!i&&r.providedCount>0&&t.removedPortsUsedByUsages.push({portName:o,providedCount:r.providedCount})}return t}function Up(e){let t=0;for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++)lt(e[n],e[o])||t++;return t}function Vp(e,t){return e.definitions.some(n=>n.model.editable===!1||n.range==null?!1:t.some(o=>o.uri===n.uri))}function qp(e){let t=e.targetSignature.definitions[0];if(!t)return[];let n=e.documents.find(i=>i.uri===t.uri);if(!n||!t.range)return[];let o=n.originalText.slice(t.range.start.offset,t.range.end.offset),r=[];for(let i of e.allDefinitions)i.signatureId===e.targetSignature.id||i.model.editable===!1||i.range==null||!e.documents.find(a=>a.uri===i.uri)||r.push({uri:i.uri??"",edits:[{range:i.range,newText:o}]});return r}function Xp(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 Gp(e){if(e.model.editable===!1)return[];let t=[],n=e.keepDefinition.range?.start.offset,o=e.model.ports.filter(r=>r.name===e.portName);for(let r of o){let i=r.range??r.nameRange;i&&(n!=null&&i.start.offset===n||t.push({uri:e.model.uri??"",edits:[{range:i,newText:""}]}))}return t}function kr(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 rt(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 yl(e){let t=[],{group:n,documents:o}=e,r=n.signatures.some(i=>i.nonEditableDefinitions.length>0);if(n.kind==="model-signature-conflict")for(let i of n.signatures){if(!Vp(i,o)||n.definitions.filter(l=>l.signatureId!==i.id&&l.model.editable!==!1&&l.range!=null).length===0)continue;let a=qp({targetSignature:i,allDefinitions:n.definitions,documents:o});a.length!==0&&t.push({id:`match-signature-${i.id}`,title:r?`Make editable definitions match signature ${i.id}`:`Make all definitions match signature ${i.id}`,description:`Replace editable definitions that do not match signature ${i.id}.`,kind:"match-signature",applicable:!0,targetSignatureId:i.id,workspaceEdits:a,editSummary:kr(a),usageImpact:On({signature:i,usageEvidence:n.usageEvidence})})}else if(n.kind==="duplicate-model-id"){let i=new Set;for(let s of n.definitions){if(i.has(s.signatureKey))continue;i.add(s.signatureKey);let a=Xp({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:kr(a)})}}else if(n.kind==="duplicate-port-name"){let i=new Set;for(let s of n.definitions){if(i.has(s.signatureKey))continue;i.add(s.signatureKey);let a=Gp({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:kr(a)})}}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 zp(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()):"",r=t.enum?JSON.stringify([...t.enum].sort()):"";return o!==r&&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 Rr(e){let t=[];for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++){let r=e[n].definitions[0]?.model,i=e[o].definitions[0]?.model;if(!r||!i)continue;let s=cl(r,i);s.length>0&&t.push({leftSignatureId:e[n].id,rightSignatureId:e[o].id,differences:s})}return t}function gl(e){let t=e.flatMap(i=>i.differences),n=t.some(i=>i.kind!=="port-default"),o=t.some(i=>i.kind==="port-default"),r=[];return n&&r.push("BT012_CONFLICTING_NODE_MODEL"),o&&r.push("BT107_CONFLICTING_PORT_DEFAULT"),{codes:r,severity:n?"error":"warning"}}function hl(e){let{nodeId:t,models:n,documents:o,code:r}=e;if(n.length<2)return;let i=ml(n);if(i.length<2&&r!=="BT006_DUPLICATE_NODE_MODEL_ID")return;let s=i.flatMap(b=>b.definitions),a=Up(n),l,d;if(r==="BT006_DUPLICATE_NODE_MODEL_ID")if(i.length===1)l=["BT006_DUPLICATE_NODE_MODEL_ID"],d="error";else{let b=Rr(i),S=gl(b);l=["BT006_DUPLICATE_NODE_MODEL_ID",...S.codes],d=S.severity}else{let b=Rr(i),S=gl(b);if(l=S.codes,d=S.severity,l.length===0)return}let c=[...new Set(s.flatMap(b=>b.model.ports.map(S=>S.name)))],p=xr({nodeId:t,documents:o,candidatePorts:c}),m=Rr(i),g=m.flatMap(b=>b.differences),y=vr(g),f=Sr(g),x={id:`model-group:${t}:${y}`,kind:e.kind??(r==="BT006_DUPLICATE_NODE_MODEL_ID"?"duplicate-model-id":"model-signature-conflict"),nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:i,differences:m,usageEvidence:p,differencePattern:{key:y,label:f},pairwiseConflictCount:a};return{...x,actions:yl({group:x,documents:o}),usageImpacts:i.map(b=>On({signature:b,usageEvidence:p}))}}function Wp(e,t){let n=[];for(let o of At(e)){let r=new Map;for(let i of o.treeNodesModel){let s=r.get(i.id)??[];s.push(i),r.set(i.id,s)}for(let[i,s]of r){if(s.length<2)continue;let a=hl({nodeId:i,models:s,documents:t,code:"BT006_DUPLICATE_NODE_MODEL_ID",kind:"duplicate-model-id"});a&&n.push(a)}}return n}function Kp(e){let{model:t,portName:n,ports:o,documents:r}=e,i=new Map;for(let m of o){let g=pl(m),y=i.get(g)??[];y.push(m),i.set(g,y)}let s=Array.from(i.entries()).sort((m,g)=>(m[1][0]?.range?.start.offset??0)-(g[1][0]?.range?.start.offset??0)),a="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),l=[];for(let m=0;m<s.length;m++){let[g,y]=s[m],f=a[m]??`S${m}`,x=y[0],b=`${t.kind} ${t.id}(${x.direction} ${x.name}${x.type?`: ${x.type}`:""}${x.defaultValue?` = "${x.defaultValue}"`:""})`,S=y.map((T,N)=>{let A=T.range??T.nameRange;return{definitionId:`${t.id}:${t.uri??""}:${t.range?.start.offset??0}:port:${n}:${A?.start.offset??N}`,uri:t.uri,sourceKind:t.source||"inline-tree-nodes-model",kind:t.kind,range:A,signatureKey:g,signatureId:f,signatureText:b,model:t}});l.push({id:f,signatureKey:g,signatureText:b,kind:t.kind,definitions:S,editableDefinitions:S.filter(T=>T.model.editable!==!1),nonEditableDefinitions:S.filter(T=>T.model.editable===!1)})}let d=[];for(let m=0;m<l.length;m++)for(let g=m+1;g<l.length;g++){let y=l[m].definitions[0]?.model.ports.find(b=>{let S=b.range??b.nameRange,T=l[m].definitions[0]?.range;return S&&T&&S.start.offset===T.start.offset}),f=l[g].definitions[0]?.model.ports.find(b=>{let S=b.range??b.nameRange,T=l[g].definitions[0]?.range;return S&&T&&S.start.offset===T.start.offset});if(!y||!f)continue;let x=zp(y,f);x.length>0&&d.push({leftSignatureId:l[m].id,rightSignatureId:l[g].id,differences:x})}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:xr({nodeId:t.id,documents:r,candidatePorts:[n]}),differencePattern:{key:vr(c),label:Sr(c)},pairwiseConflictCount:Math.max(1,o.length-1)};return{...p,actions:yl({group:p,documents:r}),usageImpacts:l.map(m=>On({signature:m,usageEvidence:p.usageEvidence}))}}function Hp(e,t){let n=[];for(let o of At(e))for(let r of o.treeNodesModel){let i=new Map;for(let s of r.ports){let a=i.get(s.name)??[];a.push(s),i.set(s.name,a)}for(let[s,a]of i){if(a.length<2)continue;let l=Kp({model:r,portName:s,ports:a,documents:t});l&&n.push(l)}}return n}function Jp(e){let t=new Set;for(let n of At(e)){let o=new Map;for(let r of n.treeNodesModel){let i=o.get(r.id)??[];i.push(r),o.set(r.id,i)}for(let[r,i]of o)i.length>=2&&t.add(r)}return t}function Yp(e){let t=new Map;for(let n of yo(e)){let o=t.get(n.id)??[];o.push(n),t.set(n.id,o)}return t}function $n(e){let t=[],n=Jp(e.workspace);for(let[o,r]of Yp(e.workspace)){if(r.length<2||n.has(o))continue;let i=hl({nodeId:o,models:r,documents:e.documents,code:"BT012_CONFLICTING_NODE_MODEL"});i&&t.push(i)}return t.push(...Wp(e.workspace,e.documents)),t.push(...Hp(e.workspace,e.documents)),t}function Un(e){return e.applicable===!0}function bl(e){return e.actions.filter(Un)}function vl(e){return e.actions.filter(t=>t.kind==="manual")}function Sl(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 Zp(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 xl(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,r]of Object.entries(e.usageEvidence.byPort)){let i=[];i.push(`provided ${r.providedCount}/${t}`),r.blackboardReferenceCount>0&&i.push(`blackboard refs ${r.blackboardReferenceCount}`),n.push(` ${o}: ${i.join(", ")}`)}return n}function kl(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 Rl(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 r=i=>i?i.length>120?`${i.slice(0,120)}...`:i:"not set";t.push(` - port \`${o.portName}\` description differs`,` ${n.leftSignatureId}: "${r(o.left)}"`,` ${n.rightSignatureId}: "${r(o.right)}"`);break}}}return t}function Tr(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(...Rl(e)),n.push("")),n.push("usage:"),n.push(...xl(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}: ${kl(s)}`);n.push("")}let r=bl(e);if(r.length>0){n.push("actions:");for(let s=0;s<r.length;s++){let a=r[s];n.push(` ${s+1}. ${a.title}`);let l=rt(a.editSummary);if(l!=="edits: none"&&n.push(` ${l}`),a.warnings)for(let d of a.warnings)n.push(` warning: ${d}`)}n.push("")}let i=vl(e);if(i.length>0){n.push("manual:");for(let s of i)if(n.push(` ${s.description}`),s.warnings)for(let a of s.warnings)n.push(` warning: ${a}`);n.push("")}return n.join(`
|
|
29
|
-
`)}function
|
|
30
|
-
`)}function
|
|
31
|
-
--- ${n.uri} ---`);for(let
|
|
32
|
-
Edit preview for: ${
|
|
33
|
-
Edit preview for: ${
|
|
34
|
-
`)}function
|
|
25
|
+
`)}function Zp(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=fo(e.code),d=l?` ${l}:`:":";i.push(`${ne(o,a,r)}[${e.code}]${d} ${e.message}${s}`);let c=e.uri||t;if(c&&(e.range?i.push(` --> ${ne(o,"dim",`${c}:${e.range.start.line+1}:${e.range.start.character+1}`)}`):i.push(` --> ${ne(o,"dim",c)}`)),e.range&&n){let p=n.get(e.uri)||n.get(t||"");p&&i.push(...Ha({sourceText:p,range:e.range,label:e.details?.primaryLabel,severity:e.severity,colorMode:o}))}if(e.details?.help&&i.push(`${ne(o,"help","help:")} ${e.details.help}`),e.details?.notes)for(let p of e.details.notes)i.push(`${ne(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(`${ne(o,"note","note:")} ${m}: ${p.message}`)}return i.join(`
|
|
26
|
+
`)}var we="0.1.4";function nn(e){return xt([e.projectDiagnostics,e.files.flatMap(t=>t.diagnostics)])}function on(e){let t=nn(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 Fn(e,t,n="human",o){return n!=="human"?"":Ve({diagnostics:t,defaultPath:e,sourceTextByUri:o})}function Ln(e,t="human",n){return e.length===0||t!=="human"?"":Ve({diagnostics:e,sourceTextByUri:n})}function On(e){let t=[...e.files].map(i=>{let{sourceText:r,rawDiagnostics:s,formatted:a,...l}=i;return{...l,diagnostics:xt([l.diagnostics])}}).sort((i,r)=>i.path.localeCompare(r.path)),n=xt([e.projectDiagnostics??[]]),o=on({projectDiagnostics:n,files:t});return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:we,project:{},projectDiagnostics:n,files:t,summary:{...o,suppressed:e.summary?.suppressed||0,baselineFiltered:e.summary?.baselineFiltered||0}},null,2)}function Un(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 $n(e){return!e||e===0?"":`note: ${e} stale baseline entries were found`}function Ja(e){return Ve({diagnostics:[{code:"BTXML_FORMAT",severity:"error",message:"file is not formatted",uri:e,details:{help:`run \`btxmlc format ${e}\``}}]})}async function Ya(e,t){let n=ki(e),o=!!(n&&Qp.existsSync(n)),r=(await ot({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:we,cliVersion:we,lspVersion:we,configPath:n,configFound:o,configValid:o,projectRoot:de(e),selectedFiles:J(e).length,ignoredFiles:di(e).length,externalModels:Re(e).length,nodeDefinitions:it(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:[Re(e).length===0?"No external TreeNodesModel files configured":void 0,it(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 Za={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=z(Wa,e);process.exitCode=await Qa(t)}};import{z as el}from"zod";var tl=St.extend({rule:el.string().optional(),output:ce,json:el.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function em(e){let t=gn(e);if(t)return t;let n=e.toUpperCase(),o=ho().filter(i=>i.startsWith(n));if(o.length===1)return gn(o[0]);if(o.length>1)return{ambiguity:o}}function nl(e){if(!e)return console.error("explain requires a rule code"),{ok:!1};let t=em(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 ol={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=z(tl,e);process.exitCode=await il(t)}};import sl from"fs";import tm from"path";import{z as Ci}from"zod";var rl=St.extend({type:Ci.string().optional(),force:Ci.boolean().optional(),output:ce,json:Ci.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function al(e){let t=tm.resolve(process.cwd(),"btxml.config.json");if(sl.existsSync(t)&&!e.force)return console.error("btxml.config.json already exists; use --force to overwrite"),{ok:!1,usage:!0};let n=mn();return sl.writeFileSync(t,`${JSON.stringify(n,null,2)}
|
|
27
|
+
`,"utf8"),console.log(`Created ${t}`),{ok:!0}}var ll={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=z(rl,e);process.exitCode=await dl(t)}};import pl from"fs";import Xe from"path";import{pathToFileURL as nm}from"url";import{z as cl}from"zod";var ul=cl.object({stdio:cl.boolean().optional()}).transform(e=>({...e,stdio:e.stdio??!1}));function om(){let e=process.argv[1]?Xe.dirname(Xe.resolve(process.argv[1])):process.cwd(),t=[Xe.resolve(e,"server.cjs"),Xe.resolve(e,"..","server.cjs"),Xe.resolve(e,"..","btxml-checker","dist","server.cjs"),Xe.resolve(e,"..","btxml-checker-monorepo","dist","server.cjs"),Xe.resolve(process.cwd(),"dist","server.cjs"),Xe.resolve(process.cwd(),"packages","btxml-lsp","dist","server.cjs")];return t.find(n=>pl.existsSync(n))||t[0]}async function ml(e){let t=om();if(!pl.existsSync(t))throw new Error(`LSP server build not found: ${t}. Run \`pnpm build\`.`);return await import(nm(t).href),{ok:!0}}var fl={command:"language-server",describe:!1,builder:e=>e.option("stdio",{type:"boolean"}),handler:async e=>{let t=z(ul,e);process.exitCode=await gl(t)}};import kt from"fs";import Ei from"path";function oe(e){return kt.readFileSync(e,"utf8")}function Rt(e,t){let n=Ei.dirname(e),o=Ei.join(n,`.${Ei.basename(e)}.${process.pid}.tmp`);try{let i=kt.statSync(e);if(i.isSymbolicLink())throw new Error(`Refusing to format symbolic link: ${e}`);kt.writeFileSync(o,t,"utf8"),kt.chmodSync(o,i.mode),kt.renameSync(o,e)}catch(i){try{kt.unlinkSync(o)}catch{}throw i}}import{z as ie}from"zod";import{z as qn}from"zod";var Vn=qn.object({baseline:qn.string().optional(),updateBaseline:qn.string().optional(),noBaseline:qn.boolean().optional()});var yl=Ie.pipe(ie.object({configPath:ie.string().optional(),projectRoot:ie.string().optional(),noConfig:ie.boolean().optional(),quiet:ie.boolean().optional(),verbose:ie.boolean().optional(),noColor:ie.boolean().optional(),output:ce,reporter:tn.optional(),json:ie.boolean().optional(),warningsAsErrors:ie.boolean().optional(),maxWarnings:ie.number().optional(),showSkipped:ie.boolean().optional(),showSuppressed:ie.boolean().optional(),fix:ie.boolean().optional()}).merge(Vn).merge(Te).transform(e=>({...e,output:e.json?"json":e.output,reporter:e.json?"json":e.reporter??e.output,maxWarnings:e.warningsAsErrors?0:e.maxWarnings})));function im(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[...t.entries()].map(([n,o])=>({uri:n,edits:[...o].sort((i,r)=>r.range.start.offset-i.range.start.offset)}))}function rm(e){let t=new Map;for(let n of e.diagnostics){if(n.code!=="BT002_MISSING_BTCPP_FORMAT")continue;let o=e.documents.find(a=>a.uri===n.uri);if(!o?.root||o.root.name!=="root"||o.root.attributes.some(a=>a.name==="BTCPP_format"))continue;let i;if(o.root.nameRange?i=o.root.nameRange.end.offset:o.root.openTagRange&&(i=o.root.openTagRange.start.offset+5),i===void 0)continue;let r=t.get(o.uri),s={range:{start:{line:0,character:0,offset:i},end:{line:0,character:0,offset:i}},newText:' BTCPP_format="4"'};t.set(o.uri,r?{uri:o.uri,edits:[...r.edits,s]}:{uri:o.uri,edits:[s]})}return[...t.values()]}function sm(e){let t=[];for(let n of e.diagnostics){let o=n.data;if(!(!o||typeof o!="object")){if(n.code==="BT121_UNUSED_MODEL_DEFINITION"){let i=o.fix;if(!i||typeof i!="object")continue;let r=i;if(r.kind!=="delete-definition"||!r.uri||!r.range)continue;t.push({uri:r.uri,edits:[{range:r.range,newText:""}]});continue}if(n.code==="BT122_DUPLICATE_MODEL_DEFINITION"){let i=o.fix;if(!i||typeof i!="object")continue;let r=i;if(r.kind!=="delete-non-canonical-definitions")continue;for(let s of r.delete??[])!s.uri||!s.range||t.push({uri:s.uri,edits:[{range:s.range,newText:""}]})}}}return t}function hl(e){return im([...rm(e),...sm({diagnostics:e.diagnostics})])}async function bl(e,t){let n=Me(de(e)),{documents:o,externalModelDocuments:i,diagnostics:r}=await H(e,n),s=await vt({project:e,documents:o,externalModelDocuments:i,mode:"lint",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...r],host:n}),a=0,l=0;if(t.fix){let f=[...t.projectDiagnostics||[],...s.projectDiagnostics,...s.files.flatMap(g=>g.rawDiagnostics??g.diagnostics)],y=hl({documents:o,diagnostics:f});if(y.length>0){let g=new Set;for(let v of y){let D=J(e).find(B=>B.absolutePath===v.uri||B.path===v.uri||B.uri===v.uri)?.absolutePath??(v.uri.startsWith("file://")?te(v.uri):v.uri),M=oe(D),P=It(M,v.edits);Rt(D,P),g.has(v.uri)||(g.add(v.uri),l++),a+=v.edits.length}let S=await H(e,n);o=S.documents,i=S.externalModelDocuments,r=S.diagnostics,s=await vt({project:e,documents:o,externalModelDocuments:i,mode:"lint",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...r],host:n})}}let d=[...t.projectDiagnostics||[],...s.projectDiagnostics],c=s.files.map(f=>({path:f.path,diagnostics:f.diagnostics,rawDiagnostics:f.rawDiagnostics,skipped:f.skipped,skipReason:f.skipReason})),p=!jn(nn({projectDiagnostics:d,files:c}),t.maxWarnings),m=on({projectDiagnostics:d,files:c});if(t.reporter==="json"&&console.log(On({ok:p,files:c,projectDiagnostics:d,summary:s.summary})),!t.quiet&&t.reporter==="human"){t.fix&&(a>0?console.log(`fixed ${a} problem${a===1?"":"s"} in ${l} file${l===1?"":"s"}`):console.log("fixed 0 problems"));let f=new Map;for(let v of J(e))f.set(v.path,oe(v.absolutePath));let y=Ln(d,t.reporter,f);y&&console.error(y);for(let v of c){let x=Fn(v.path,v.diagnostics,t.reporter,f);x&&console.error(x)}let g=s.summary?.staleEntries?.length,S=Un(p,c.length,g,"lint",m.errors,m.warnings,t.maxWarnings===0);if(p)t.fix?a===0&&console.log("ok: lint passed"):console.log(S);else{console.error(S);let v=$n(g);v&&console.error(v)}}return{ok:p,files:c,projectDiagnostics:d,summary:m}}var vl={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("stdout",{type:"boolean",hidden:!0}),handler:async e=>{if(e.stdout)throw new F("--stdout is not supported for `lint`",2,"use `--output json` for machine-readable output");let t=z(yl,e);process.exitCode=await Sl(t)}};import{z as ue}from"zod";var xl=Ie.pipe(ue.object({configPath:ue.string().optional(),projectRoot:ue.string().optional(),noConfig:ue.boolean().optional(),quiet:ue.boolean().optional(),verbose:ue.boolean().optional(),noColor:ue.boolean().optional(),output:ce,json:ue.boolean().optional(),write:ue.boolean().optional(),show:ue.string().optional(),source:ue.enum(["model-files"]).optional(),mode:ue.enum(["auto","sync","dedupe"]).optional()}).merge(Te).transform(e=>({...e,output:e.json?"json":e.output})));import{stdin as am,stdout as kl}from"process";import{createInterface as lm}from"readline/promises";async function Xn(e){let t=lm({input:am,output:kl});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(`
|
|
28
|
+
`)} `),i=Number(o.trim());if(!Number.isNaN(i)&&i>=1&&i<=e.choices.length)return e.choices[i-1].value;kl.write(`Please enter a number between 1 and ${e.choices.length}.
|
|
29
|
+
`)}}finally{t.close()}}function Rl(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 Dl(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:Rl(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:Rl(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 Ni(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 dm(e){return"portName"in e}function Mi(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(dm).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 Il(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 cm(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 um(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 Tl(e){return`${e.kind} ${e.id}(${e.ports.map(um).join(", ")})`}function Cl(e){let t=new Map;for(let i of e){let r=cm(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:Tl(c),model:c}));return{id:a,signatureKey:i,signatureText:Tl(l),kind:l.kind,definitions:d,editableDefinitions:d.filter(c=>c.model.editable!==!1),nonEditableDefinitions:d.filter(c=>c.model.editable===!1)}})}function pm(e){return/^\{[^}]+\}$/.test(e.trim())}function mm(e){return e.name==="SubTree"?e.attributes.find(n=>n.name==="ID")?.value??e.name:e.name}function El(e,t,n,o){let i=0;if(mm(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++,pm(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+=El(r,t,n,o));return i}function Gn(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+=El(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 rt(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 fm(e){let t=0;for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++)ct(e[n],e[o])||t++;return t}function gm(e,t){return e.definitions.some(n=>n.model.editable===!1||n.range==null?!1:t.some(o=>o.uri===n.uri))}function Nl(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 Ml(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 ym(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 st(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 Pi(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(!gm(r,o)||n.definitions.filter(l=>l.signatureId!==r.id&&l.model.editable!==!1&&l.range!=null).length===0)continue;let a=Nl({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:rt({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=Ml({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=ym({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=Nl({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:rt({signature:l,usageEvidence:n.usageEvidence})})}if(e.options.canonicalMode==="dedupe"){let d=Ml({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:rt({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 hm(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 wi(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=Dl(i,r);s.length>0&&t.push({leftSignatureId:e[n].id,rightSignatureId:e[o].id,differences:s})}return t}function wl(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 Pl(e){let{nodeId:t,models:n,documents:o,code:i}=e;if(n.length<2)return;let r=Cl(n);if(r.length<2&&i!=="BT006_DUPLICATE_NODE_MODEL_ID"&&!e.forceIncludeEquivalent)return;let s=r.flatMap(v=>v.definitions),a=fm(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=wi(r),x=wl(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=Gn({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:Pi({group:P,documents:o,options:e.options}),usageImpacts:r.map(B=>rt({signature:B,usageEvidence:P.usageEvidence}))}}let v=wi(r),x=wl(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=Gn({nodeId:t,documents:o,candidatePorts:c}),m=wi(r),f=m.flatMap(v=>v.differences),y=Ni(f),g=Mi(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:Pi({group:S,documents:o,options:e.options}),usageImpacts:r.map(v=>rt({signature:v,usageEvidence:p}))}}function bm(e,t){let n=[];for(let o of gt(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=Pl({nodeId:r,models:s,documents:t,code:"BT006_DUPLICATE_NODE_MODEL_ID",kind:"duplicate-model-id"});a&&n.push(a)}}return n}function vm(e){let{model:t,portName:n,ports:o,documents:i}=e,r=new Map;for(let m of o){let f=Il(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=hm(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:Gn({nodeId:t.id,documents:i,candidatePorts:[n]}),differencePattern:{key:Ni(c),label:Mi(c)},pairwiseConflictCount:Math.max(1,o.length-1)};return{...p,actions:Pi({group:p,documents:i}),usageImpacts:l.map(m=>rt({signature:m,usageEvidence:p.usageEvidence}))}}function Sm(e,t){let n=[];for(let o of gt(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=vm({model:i,portName:s,ports:a,documents:t});l&&n.push(l)}}return n}function xm(e){let t=new Set;for(let n of gt(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 km(e){let t=$t(Ut(e)),n=new Map;for(let[o,i]of t)n.set(o,i.map(r=>r.model));return n}function zn(e){let t=[],n=xm(e.workspace);for(let[o,i]of km(e.workspace)){if(i.length<2||n.has(o))continue;let r=Pl({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(...bm(e.workspace,e.documents)),t.push(...Sm(e.workspace,e.documents)),t}function Wn(e){return e.applicable===!0}function Bl(e){return e.actions.filter(Wn)}function _l(e){return e.actions.filter(t=>t.kind==="manual")}function Al(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 Rm(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 jl(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 Fl(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 Ll(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 Bi(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(...Ll(e)),n.push("")),n.push("usage:"),n.push(...jl(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}: ${Fl(s)}`);n.push("")}let i=Bl(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=st(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=_l(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
|
+
`)}function Kn(e){if(e.groups.length===0)return"ok: no model conflicts found";let t=Al(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(` ${Rm(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(...Ll(r).map(l=>` ${l}`)),n.push("")),n.push(" usage:"),n.push(...jl(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}: ${Fl(l)}`);n.push("")}let s=Bl(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=st(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=_l(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(`
|
|
31
|
+
`)}function _i(e){let t=e.groups.filter(i=>i.severity==="error").length,n=e.groups.filter(i=>i.severity==="warning").length,o=Al(e.groups);return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:we,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 Ai(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 Dm(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 Hn(e){let t=new Map;for(let n of e)t.set(n.uri,n);return Array.from(t.values())}function ji(e){return it(e).flatMap(t=>{try{return[{uri:t.path,path:t.absolutePath,kind:"generic-xml",isBtXml:!1,nodes:[],diagnostics:[],originalText:oe(t.absolutePath)}]}catch{return[]}})}function Ul(e,t){return[...J(e),...Re(e),...it(e)].find(i=>i.absolutePath===t||i.path===t)?.absolutePath??t}function Tm(e,t){for(let n of Ai(t)){let o=Ul(e,n.uri),i=oe(o),r=It(i,n.edits);Rt(o,r)}}function Ol(e,t){for(let n of Ai(t)){let o=Ul(e,n.uri),i=oe(o);console.log(`
|
|
32
|
+
--- ${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 $l(e,t){let n=Me(de(e)),o=tt(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 H(e,n),{documents:d}=l,{externalModelDocuments:c}=l,p=Hn([...d,...c,...ji(e)]),m=await ot({project:e,documents:d,externalModelDocuments:c,host:n}),f=zn({documents:p,workspace:m.semanticIndex,project:e,options:{includeConventionGroups:a,convention:o.models.convention,canonicalSource:i,canonicalMode:s}});if(t.show){let S=Dm(f,t.show);if(!S)throw new F(`error: no model group found for \`${t.show}\``,2,"run `btxmlc repair` to see available model groups");return t.output==="json"?console.log(_i({ok:!1,groups:[S]})):console.log(Bi(S)),{ok:!1,groups:[S]}}let y=!1;if(t.write){if(process.stdin.isTTY!==!0)throw new F("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 H(e,n);d=D.documents,c=D.externalModelDocuments;let M=Hn([...d,...c,...ji(e)]);m=await ot({project:e,documents:d,externalModelDocuments:c,host:n}),f=zn({documents:M,workspace:m.semanticIndex,project:e,options:{includeConventionGroups:a,convention:o.models.convention,canonicalSource:i,canonicalMode:s}});let P=f.filter(E=>!S.has(E.id));if(P.length===0)break;let B=P[0];t.output==="human"&&!t.quiet&&console.log(Bi(B,{index:f.indexOf(B)+1,total:f.length}));let A=B.actions.filter(Wn),re=[...A.map(E=>({label:E.title,value:E.id,description:st(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:""}],O=await Xn({message:`Resolve \`${B.displayName}\``,choices:re});if(O==="quit"){y=!0;break}if(O==="skip"){S.add(B.id);continue}if(O==="preview"){let E=A.map(L=>({label:L.title,value:L.id,description:st(L.editSummary)}));E.push({label:"Back",value:"back",description:""});let _=await Xn({message:"Preview which action?",choices:E});if(_==="back")continue;let R=B.actions.find(L=>L.id===_);R&&t.output==="human"&&!t.quiet&&(console.log(`
|
|
33
|
+
Edit preview for: ${R.title}`),Ol(e,R.workspaceEdits));continue}let me=B.actions.find(E=>E.id===O);if(!me||!Wn(me)){S.add(B.id);continue}let b=[{label:"Apply",value:"apply",description:st(me.editSummary)},{label:"Show edit preview",value:"preview",description:""},{label:"Back",value:"back",description:""}],w=await Xn({message:`Apply edits for \`${B.displayName}\`?`,choices:b});if(w!=="back"){if(w==="preview"){console.log(`
|
|
34
|
+
Edit preview for: ${me.title}`),Ol(e,me.workspaceEdits);continue}Tm(e,me.workspaceEdits)}}let v=await H(e,n);d=v.documents,c=v.externalModelDocuments;let x=Hn([...d,...c]);m=await ot({project:e,documents:d,externalModelDocuments:c}),f=zn({documents:Hn([...x,...ji(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(Kn({ok:!1,groups:f}))}let g=f.length===0;return t.output==="json"?console.log(_i({ok:g,groups:f})):t.quiet||(t.write?g?console.log("ok: all model conflicts resolved"):y||console.log(Kn({ok:g,groups:f})):console.log(Kn({ok:g,groups:f}))),{ok:g,groups:f}}var ql={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=z(xl,e);process.exitCode=await Vl(t)}};import Jn from"fs";import Ge from"path";function Xl(e,t){for(let n of Jn.readdirSync(e,{withFileTypes:!0})){let o=Ge.join(e,n.name);t.push(o),n.isDirectory()&&!n.isSymbolicLink()&&Xl(o,t)}}function Im(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 Fi(e,t){let n=e.split(Ge.sep).join("/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||Ge.basename(n)===o:Im(o).test(n)}function Cm(e){return e.includes("*")||e.includes("?")}function Gl(e,t,n=[]){let o=[],i=[];for(let r of e){let s=r.replace(/\\/g,Ge.sep);if(Jn.existsSync(s)&&Jn.statSync(s).isFile()){let a=Ge.relative(t,s).split(Ge.sep).join("/");n.some(l=>Fi(a,l))||o.push(r);continue}Cm(r)&&i.push(r)}if(i.length>0){let r=[];Xl(t,r);for(let s of r.filter(a=>Jn.statSync(a).isFile())){let a=Ge.relative(t,s).split(Ge.sep).join("/"),l=i.some(c=>Fi(a,c)),d=n.some(c=>Fi(a,c));l&&!d&&o.push(s)}}return[...new Set(o)].sort()}async function Dt(e,t){let n=await ui({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=Ve({diagnostics:n.diagnostics});return r&&console.error(r),null}let o=n.project,i=tt(o);return i?{...n,project:o,resolvedConfig:i}:null}import Em from"path";function Yn(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(`
|
|
35
|
+
`)}function Nm(e){return[...new Map(e.map(t=>[t.path,t])).values()]}function Mm(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=Q(n.resolvedConfig,e),i=ht(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(T("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 Li(e,t){let n=de(e),o=Me(n),{documents:i,externalModelDocuments:r,diagnostics:s}=await H(e,o),a=new Map;for(let v of J(e))a.set(v.path,oe(v.absolutePath));let l=t.noLint||t.formatOnly?void 0:await vt({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=Nm([...J(e),...Re(e)]).map(v=>{let x=oe(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)??oe(Em.resolve(n,v.path)),D=Mm(v.path,x,t),M=c.get(v.path),P=[...M?.diagnostics||v.diagnostics||[],...D.diagnostics],B={path:v.path,diagnostics:P,rawDiagnostics:M?.rawDiagnostics,needsFormat:D.needsFormat,skipped:M?.skipped,skipReason:M?.skipReason,formatted:D.formatted};p.push(B)}let y=nn({projectDiagnostics:d,files:p}),g=!jn(y,t.maxWarnings),S=on({projectDiagnostics:d,files:p});if(t.reporter==="json"&&console.log(On({ok:g,files:p,projectDiagnostics:d,summary:l?.summary})),!t.quiet&&t.reporter==="human"){let v=Ln(d,t.reporter,a);v&&console.error(v);for(let M of p){let P=a.get(M.path)??"",B=Fn(M.path,M.diagnostics,t.reporter,a);B&&console.error(B),M.needsFormat&&t.diff&&M.formatted&&console.log(Yn(P,M.formatted,M.path))}let x=l?.summary?.staleEntries?.length,D=Un(g,p.length,x,"check",S.errors,S.warnings,t.maxWarnings===0);if(g)console.log(D);else{console.error(D);let M=$n(x);M&&console.error(M)}}return{ok:g,files:p,projectDiagnostics:d,summary:S}}function wm(e,t,n,o){o.quiet||(console.error(Ja(e)),o.diff&&console.log(Yn(t,n,e)))}function Pm(e,t,n){let o=Q(n.config,e),i=ht(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(Ve({diagnostics:i.diagnostics,defaultPath:e,sourceTextByUri:r}))}return{changed:!1,failed:!0}}if(n.check){let r=i.text!==t;return r&&wm(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&&Rt(e,i.text),{changed:i.text!==t,failed:!1})}function Zn(e,t){let n=[],o=!1;for(let i of e){let r=oe(i),s=Pm(i,r,t);n.push({path:i,changed:s.changed}),s.failed&&(o=!0)}return{ok:!o,results:n}}function Bm(e){return Gl(e.map(t=>t.replace(/\\/g,"/")),process.cwd(),[])}async function zl(e){let t=await Dt("format",e);if(!t)return 2;let n=e.output??"human",o={...e,output:n,config:t.resolvedConfig};if(e.stdout){let r=Bm(e.files??[]);if(r.length!==1)throw new F("`--stdout` requires exactly one file",2,"pass exactly one XML file when using `--stdout`");if(e.check)throw new F("`--stdout` cannot be used with `--check`",2,"remove either `--stdout` or `--check`");if(e.diff)throw new F("`--stdout` cannot be used with `--diff`",2,"remove either `--stdout` or `--diff`");return Zn(r,o).ok?0:1}let i=(e.files??[]).length>0?J(t.project):[...J(t.project),...Re(t.project)];return Zn([...new Map(i.map(r=>[r.absolutePath,r])).values()].map(r=>r.absolutePath),o).ok?0:1}async function Sl(e){let t=await Dt("lint",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=Ti(t.project,e),i={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},r=await bl(t.project,i);return Ii(t.project,e,[...r.projectDiagnostics,...r.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),r.ok?0:1}async function Wl(e){let t=await Dt("check",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=Ti(t.project,e),i={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},r=await Li(t.project,i);return Ii(t.project,e,[...r.projectDiagnostics,...r.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),r.ok?0:1}async function Vl(e){let t=await Dt("repair",e);if(!t)return 2;let n=e.output??"human";return(await $l(t.project,{...e,output:n,show:e.show})).ok?0:1}async function Qa(e){let t=await Dt("check",e);if(!t)return 2;let n=e.output??"human";return(await Ya(t.project,{output:n})).ok?0:1}async function dl(e){return al({type:e.type,force:e.force}).ok?0:2}async function il(e){return nl(e.rule).ok?0:2}async function gl(e){return await ml({stdio:e.stdio}),0}import{z as q}from"zod";var Kl=Ie.pipe(q.object({configPath:q.string().optional(),projectRoot:q.string().optional(),noConfig:q.boolean().optional(),quiet:q.boolean().optional(),verbose:q.boolean().optional(),noColor:q.boolean().optional(),output:ce,reporter:tn.optional(),json:q.boolean().optional(),warningsAsErrors:q.boolean().optional(),noFormat:q.boolean().optional(),noLint:q.boolean().optional(),formatOnly:q.boolean().optional(),lintOnly:q.boolean().optional(),maxWarnings:q.number().optional(),showSkipped:q.boolean().optional(),showSuppressed:q.boolean().optional(),diff:q.boolean().optional(),fix:q.boolean().optional()}).merge(Vn).merge(Te).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 Hl={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 F("--stdout is not supported for `check`",2,"use `--output json` for machine-readable output");let t=z(Kl,e);process.exitCode=await Wl(t)}};import{z as pe}from"zod";var Jl=Ie.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(),check:pe.boolean().optional(),diff:pe.boolean().optional(),stdout:pe.boolean().optional(),write:pe.boolean().optional(),force:pe.boolean().optional(),output:za}).merge(Te).transform(e=>({...e})));var Yl={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=z(Jl,e);process.exitCode=await zl(t)}};var jm=new Set(["format","lint","check","repair","init","explain","doctor","language-server"]);function Fm(e,t){let n=e||"invalid command",o=n.match(/^Not enough arguments following: (.+)$/);if(o)return new F(`--${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("-")&&!jm.has(a)?new F(`unknown command \`${a}\``,2,"run `btxmlc --help` to see available commands"):new F(`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 F(`unknown option \`--${s}\``,2,"run `btxmlc --help` to see supported options")}return new F(n,2)}async function Zl(e){try{return await Am(_m(["node","btxmlc",...e])).scriptName("btxmlc").version(we).parserConfiguration({"boolean-negation":!1}).strict().recommendCommands().demandCommand(1).command(Yl).command(vl).command(Hl).command(ql).command(ll).command(ol).command(Za).command(fl).fail((t,n)=>{throw n??Fm(t,e)}).parseAsync(),typeof process.exitCode=="number"?process.exitCode:0}catch(t){return Va(t)}}Zl(process.argv.slice(2)).then(e=>{process.exitCode=e});
|