@abco20/btxml-checker 0.1.0 → 0.1.1

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/index.js CHANGED
@@ -5,7 +5,7 @@ var b={Error:"error",Warning:"warning",Info:"info"};function P(e,t,n,r,i="",o,s)
5
5
  `?(s+=1,a=0):a+=1}function x(){for(;!m()&&vi(p());)g()}let T=(f,k,D,E,h,w)=>{n.push(P(f,k,D,v(E,h),i.uri,w))};function N(f,k,D,E,h,w){n.push(P(f,k,D,E&&h?v(E,h):void 0,i.uri,w))}function I(){if(!hi(p()))return"";let f=o;for(g();!m()&&Ti(p());)g();return e.slice(f,o)}function W(){let f=p();if(f!=='"'&&f!=="'")return{value:"",ok:!1};let k=l();g();let D=l(),E=o;for(;!m()&&p()!==f&&p()!=="<";)g();let h=l();if(m()||p()!==f)return{value:e.slice(E,o),ok:!1,valueRange:v(k,h),valueContentRange:v(D,h)};let w=e.slice(E,o);g(),ft(w,D.offset,e,T);let $=an(w);return{value:$.value,valueOffsets:$.offsets,ok:!0,valueRange:v(k,l()),valueContentRange:v(D,h)}}function A(){let f=[],k=new Set;for(;;){x();let D=p();if(!D||D===">"||D==="/"&&p(1)===">")break;let E=l(),h=I(),w=l();if(!h)break;x();let $=l();if(p()!=="="){if(T("XML001_INVALID_SYNTAX",b.Error,"invalid attribute syntax",E,w,{primaryLabel:`expected \`=\` after attribute \`${h}\``,help:`write the attribute as \`${h}="..."\``}),u=!0,r)continue;break}g();let yi=l();x();let pt=l(),Q=W(),le=l();if(!Q.ok&&(T("XML005_INVALID_ATTRIBUTE_VALUE",b.Error,"invalid attribute value",pt,le,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${h}="value"\``}),u=!0,!r)||(k.has(h)?T("XML004_DUPLICATE_ATTRIBUTE",b.Error,`duplicate attribute \`${h}\``,E,le,{primaryLabel:`attribute \`${h}\` is already defined on this element`,help:`remove one of the duplicate \`${h}\` attributes`}):k.add(h),f.push({name:h,value:Q.value,...Q.valueOffsets?{valueOffsets:Q.valueOffsets}:{},range:v(E,le),fullRange:v(E,le),nameRange:v(E,w),equalsRange:v($,yi),valueRange:Q.valueRange||v(pt,le),valueContentRange:Q.valueContentRange||v(pt,le)}),!Q.ok&&r))break}return f}function B(f){d.length>0?d[d.length-1].children.push(f):(i.nodes.push(f),!i.root&&f.kind==="element"&&(i.root=f))}function Ve(){let f=l(),k=o;for(;!m()&&p()!=="<";)g();let D=e.slice(k,o);if(D.length===0)return;for(let h of D)if(Ri(h)){T("XML007_INVALID_CHARACTER",b.Error,"invalid XML character",f,l(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}ft(D,k,e,T);let E={kind:"text",text:Se(D),range:v(f,l()),fullRange:v(f,l())};B(E)}function Oe(){let f=l();g(4);let k=l(),D=o;for(;!m()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)g();let E=e.slice(D,o);if(m()){if(T("XML001_INVALID_SYNTAX",b.Error,"unterminated XML comment",f,l(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),u=!0,!r)return;let $={kind:"comment",text:E,range:v(f,l()),fullRange:v(f,l()),contentRange:v(k,l())};B($);return}(E.includes("--")||E.endsWith("-"))&&T("XML001_INVALID_SYNTAX",b.Error,"invalid XML comment",k,l(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let h=l();g(3);let w={kind:"comment",text:E,range:v(f,l()),fullRange:v(f,l()),contentRange:v(k,h)};B(w)}function de(){let f=l();g(5),x();let k=A();x(),p()==="?"&&p(1)===">"?g(2):T("XML001_INVALID_SYNTAX",b.Error,"invalid XML declaration",f,l(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let D={range:v(f,l()),attributes:k};for(let E of k)E.name==="version"&&(D.version=E.value),E.name==="encoding"&&(D.encoding=E.value),E.name==="standalone"&&(D.standalone=E.value);i.xmlDeclaration=D}function gi(){let f=l();g(2),x();let k=l(),D=I(),E=l();if(x(),p()!==">")for(T("XML001_INVALID_SYNTAX",b.Error,"invalid closing tag syntax",f,l(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),u=!0;!m()&&p()!==">";)g();p()===">"&&g();let h=d.pop();if(!h||h.name!==D){let w=h?h.name:D||"",$=D||"";T("XML006_MISSING_CLOSING_TAG",b.Error,`mismatched closing tag \`</${$}>\``,f,l(),{primaryLabel:`opened as \`<${w}>\` but closed as \`</${$}>\``,help:`change the closing tag to \`</${w}>\` or fix the nesting`});return}h.closeTagRange=v(f,l()),h.endTagRange=v(f,l()),h.nameRange||(h.nameRange=v(k,E)),h.range=v(h.range.start,l()),h.fullRange=v(h.range.start,l())}for(;!m();)if(p()==="<")if(p(1)==="?")if(e.slice(o,o+5).toLowerCase()==="<?xml"&&e.charAt(o+5)===" ")de();else{let f=l();for(;!m()&&!(p()==="?"&&p(1)===">");)g();m()||g(2),T("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",b.Error,"processing instruction is not supported",f,l(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")Oe();else if(p(1)==="!"&&p(2)==="["&&e.slice(o+3,o+9)==="CDATA["){let f=l();for(g(8);!m()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)g();m()||g(3),T("XML010_UNSUPPORTED_CDATA",b.Error,"CDATA is not supported",f,l(),{primaryLabel:"CDATA sections are not supported by btxml",help:"replace the CDATA section with normal escaped XML text",notes:["escape `<` as `&lt;`, `>` as `&gt;`, and `&` as `&amp;`"]})}else if(p(1)==="!"&&e.slice(o+2,o+9)==="DOCTYPE"){let f=l();for(g(8);!m()&&p()!==">";)g();m()||g(1),T("XML011_UNSUPPORTED_DOCTYPE",b.Error,"DOCTYPE is not supported",f,l(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")gi();else{let f=l();g();let k=l(),D=I(),E=l();if(!D){if(T("XML001_INVALID_SYNTAX",b.Error,"invalid XML tag",f,l(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),u=!0,r){g();continue}break}let h={kind:"element",name:D,attributes:[],children:[],range:v(f,f),fullRange:v(f,f),openTagRange:v(f,f),startTagRange:v(f,f),nameRange:v(k,E),selfClosing:!1};if(h.attributes=A(),x(),p()==="/"&&p(1)===">"){g(2),h.selfClosing=!0,h.openTagRange=v(f,l()),h.startTagRange=h.openTagRange,h.range=v(f,l()),h.fullRange=v(f,l()),B(h);continue}if(p()!==">"){if(T("XML001_INVALID_SYNTAX",b.Error,"invalid XML tag",f,l(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),u=!0,r){h.openTagRange=v(f,l()),h.startTagRange=h.openTagRange,h.range=v(f,l()),h.fullRange=v(f,l()),B(h);continue}break}g(),h.openTagRange=v(f,l()),h.startTagRange=h.openTagRange,h.range=v(f,l()),h.fullRange=v(f,l()),B(h),d.push(h)}else Ve();if(d.length>0){let f=d[d.length-1];if(T("XML006_MISSING_CLOSING_TAG",b.Error,`missing closing tag for \`<${f.name}>\``,f.openTagRange.start,f.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${f.name}>\` before the end of the file`}),u=!0,r)for(;d.length>0;){let k=d.pop();if(!k)break;k.range=v(k.range.start,l()),k.fullRange=v(k.range.start,l())}}let on=i.nodes.filter(f=>f.kind==="element");on.length===0?N("XML002_MISSING_ROOT",b.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):on.length>1&&N("XML003_MULTIPLE_ROOTS",b.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 qe=i.root;if(qe)for(let f of i.nodes)f!==qe&&f.kind==="text"&&f.text.trim().length>0&&T("XML016_TEXT_OUTSIDE_ROOT",b.Error,"text outside root element",f.range.start,f.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!i.xmlDeclaration)N("XML008_MISSING_DECLARATION",b.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 f=i.xmlDeclaration.encoding;T("XML009_INVALID_ENCODING",b.Warning,"XML encoding should be UTF-8",i.xmlDeclaration.range.start,i.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${f}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return qe&&mt(qe,f=>{T("XML015_UNSUPPORTED_MIXED_CONTENT",b.Warning,"mixed XML content is not supported",dn(f.range.start),dn(f.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"]})}),sn({document:i,diagnostics:n,partial:u,options:t})}var be={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function ln(e){if(!e)return be;let t=typeof e.indentWidth=="number"?e.indentWidth:be.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:be.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:be.blankLineBetweenBehaviorTrees,i=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:be.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:i}}function Fe(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Xe(e){return Fe(e).replace(/"/g,"&quot;")}function xi(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function ki(e,t,n){return`${" ".repeat(e*n)}${t}`}function ce(e,t,n,r){let i=" ".repeat(t*r),o=e.attributes||[];if(o.length===0)return[`${i}<${e.name}${n}`];if(o.length===1)return[`${i}<${e.name} ${o[0].name}="${Xe(o[0].value)}"${n}`];let s=[`${i}<${e.name} ${o[0].name}="${Xe(o[0].value)}"`],a=" ".repeat(i.length+1+e.name.length+1);for(let d=1;d<o.length;d+=1){let u=o[d],l=d===o.length-1?n:"";s.push(`${a}${u.name}="${Xe(u.value)}"${l}`)}return s}function je(e,t,n,r){let i=" ".repeat(t*n);if(e.kind==="comment")return[`${i}<!--${e.text}-->`];if(e.kind==="text"){let l=e.text.trim();return l?[ki(t,Fe(l),n)]:[]}let o=xi(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(l=>l.kind==="text").map(l=>l.text).join("").trim(),d=o.some(l=>l.kind==="element"||l.kind==="comment");if(a&&d&&!s&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!d){if((e.attributes||[]).length<=1){let l=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${Xe(e.attributes[0].value)}"`;return[`${i}<${e.name}${l}>${Fe(a)}</${e.name}>`]}return ce(e,t,`>${Fe(a)}</${e.name}>`,n)}if(o.length===0){if(e.selfClosing)return ce(e,t,"/>".slice(0),n);let l=ce(e,t,">",n);return l.push(`${i}</${e.name}>`),l}let u=ce(e,t,">",n);for(let l of e.children||[])l.kind==="text"&&l.text.trim()===""||u.push(...je(l,t+1,n,r));return u.push(`${i}</${e.name}>`),u}function Di(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function un(e,t,n,r){let i=[],o=Di(e);for(let s=0;s<o.length;s+=1){let a=o[s],d=o[s-1],u=o[s+1],l=n&&a.kind==="element"&&a.name==="BehaviorTree"&&d&&d.kind==="element"&&d.name==="BehaviorTree",m=a.kind==="element"&&a.name==="TreeNodesModel"&&d!==void 0&&d.kind!=="comment",p=a.kind==="comment"&&u&&u.kind==="element"&&u.name==="TreeNodesModel"&&d!==void 0;(l||m||p)&&i.length>0&&i[i.length-1]!==""&&i.push(""),a.kind==="element"?(i.push(...je(a,1,t,r)),a.name==="TreeNodesModel"&&i.push("")):i.push(...je(a,1,t,r))}return i}function he(e,t={}){let n=ee(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(T=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(T.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let i=n.document.root,o=ln(t),s=o.indentWidth,a=[],d=n.document.xmlDeclaration!==void 0;if((o.xmlDeclaration==="always"||o.xmlDeclaration==="preserve"&&d)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...ce(i,0,">",s)),a.push(...un(i.children||[],s,o.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${i.name}>`),n.diagnostics.some(T=>T.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let u=`
6
6
  `;(o.lineEnding==="crlf"||o.lineEnding==="auto"&&e.includes(`\r
7
7
  `))&&(u=`\r
8
- `);let l=a.join(u),m=u.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${m})+$`,"u"),x=`${l.replace(p,"")}${u}`;return{ok:!0,text:x,changed:x!==e,skipped:!1,diagnostics:n.diagnostics.filter(T=>T.severity!==b.Error)}}function gt(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 yt(e,t,n){let r=t.valueContentRange??t.valueRange,i=gt(t,n.start),o=gt(t,n.end),s=C(e.originalText,r.start.offset+i),a=C(e.originalText,r.start.offset+o);return v(s,a)}import{z as $e}from"zod";var y={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},$a=Object.values(y).sort();var Ei=$e.object({subTreePorts:$e.enum(["loose","strict"]).optional()}).strict(),Ni=$e.object({allowStringEntryCompatibility:$e.boolean().optional()}).strict(),cn={"script/valid-syntax":{code:y.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:y.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:y.AssignmentToUnknownVariable,codes:[y.AssignmentToUnknownVariable,y.InvalidCompoundAssignment,y.ScriptVariableTypeMismatch],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:y.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:y.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:y.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:y.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:y.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:y.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:y.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:y.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:y.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:y.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:y.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:y.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:y.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:y.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:y.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:y.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:y.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:y.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:y.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:y.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:y.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:y.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:y.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:y.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:y.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:y.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:y.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:y.UnknownPort,defaultSeverity:"warn",optionsSchema:Ei,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:y.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:y.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:Ni,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:y.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:y.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:y.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:y.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:y.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:y.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:y.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:y.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var ze=["off","info","warn","error"];var pn={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"}}},Ci={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 St(){return structuredClone(Ci)}function Te(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 Ii={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Bi(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function X(e,t){return e.attributes.find(n=>n.name===t)}function Mi(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function _i(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function wi(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function mn(e,t,n){for(let r of e.attributes||[]){let i=[...String(r.value).matchAll(/\{([^}]+)\}/g)];for(let o of i){let s=o.index??0,a=r.valueRange.start,d={...a,character:a.character+o[0].length,offset:a.offset+s+o[0].length};t.push({name:o[1],attributeName:r.name,element:e,uri:n,range:{start:{...a,character:a.character+s,offset:a.offset+s},end:d}})}}for(let r of e.children||[])r.kind==="element"&&mn(r,t,n)}function Pi(e,t,n,r){let i=[];for(let o of e.children||[]){if(o.kind!=="element"||!Mi(o.name))continue;let s=X(o,"ID");if(!s)continue;let a=[];for(let d of o.children||[]){if(d.kind!=="element"||d.name!=="input_port"&&d.name!=="output_port"&&d.name!=="inout_port")continue;let u=X(d,"name"),l=X(d,"type"),m=X(d,"default")||X(d,"default_value"),p=X(d,"enum"),g=(d.children||[]).filter(N=>N.kind==="text").map(N=>N.text).join("").trim()||void 0,x=d.name==="input_port"?"input":d.name==="output_port"?"output":"inout",T=(x==="input"||x==="inout")&&m===void 0;a.push({source:n,direction:x,name:u?u.value:"",type:l?.value||void 0,defaultValue:m?.value||void 0,description:g,required:T,element:d,uri:t,range:d.range,nameRange:u?.range,enum:p?.value?p.value.split(";"):void 0})}i.push({id:s.value,kind:o.name,source:n,sourceMeta:{sourceKind:n,file:t,range:o.range},editable:r,ports:a,element:o,uri:t,range:o.range,elementRange:o.range,idRange:s.range})}return i}function Ai(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let i=X(r,"ID");i&&n.push({id:i.value,kind:"BehaviorTree",uri:t,element:r,range:r.range,elementRange:r.range,idRange:i.range})}return n}function Li(e,t){let n=[],r=(i,o)=>{let s=i.name==="BehaviorTree"?X(i,"ID")?.value??o:o;if(i.name==="SubTree"){let a=X(i,"ID");a&&n.push({id:a.value,uri:t,element:i,range:i.range,elementRange:i.range,idRange:a.range,parentBehaviorTreeId:s,attributes:i.attributes})}for(let a of i.children||[])a.kind==="element"&&r(a,s)};for(let i of e.children||[])i.kind==="element"&&r(i);return n}function Ui(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function fn(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 Vi(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(fn),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 Oi(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function qi(e){return{name:e.name,attributeName:e.attributeName,uri:e.uri,range:e.range}}function Fi(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Ui),subtreeReferences:e.subtreeReferences.map(Oi),blackboardReferences:e.blackboardReferences.map(qi),treeNodesModel:e.treeNodesModel.map(Vi),genericSubTreePorts:e.genericSubTreePorts.map(fn),rootMainTreeToExecute:_i(e.rootMainTreeToExecute)}}function Xi(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function ji(e){return P(Ii.DuplicateNodeModelId,b.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 $i(e,t){let n=[],r=t?.uri||e.uri,i=e.root,o=e.isBtXml,s=Bi(e),a=wi(e),d=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=i&&e.kind!=="model-document"?Ai(i,r):[],l=[],m=[],p=i?i.name==="TreeNodesModel"?[i]:i.children.filter(I=>I.kind==="element"&&I.name==="TreeNodesModel"):[];for(let I of p){let W=Pi(I,r,a,d),A=new Map;for(let B of W)Xi({node:B,treeNodesModel:l,genericSubTreePorts:m})||(A.has(B.id)?n.push(ji(B)):A.set(B.id,B))}let g=i?Li(i,r):[],x=i?(()=>{let I=[];return mn(i,I,r),I})():[],T=i?X(i,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Fi({uri:r,path:t?.path??e.path,isBtXml:o,kind:s,behaviorTrees:u,subtreeReferences:g,blackboardReferences:x,treeNodesModel:l,genericSubTreePorts:m,rootMainTreeToExecute:T?{uri:r,range:T.range,value:T.value}:void 0}),extractedBehaviorTrees:u,extractedTreeNodesModel:l,extractedSubTreeReferences:g,extractedBlackboardReferences:x},diagnostics:n}}function gn(e,t){let{extracted:n,diagnostics:r}=$i(e,t);return{model:n.publicModel,diagnostics:r}}function bt(e,t){return gn(e,t)}var yn=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),zi=new Set([...yn,"_autoremap","_description","__shared_blackboard"]),Ki=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 ht(e){return yn.has(e)}function Sn(e){return zi.has(e)}function Tt(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(Sn(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===`
9
- `||t==="\r")return"port names must not contain whitespace";let r=Ki.get(t);if(r)return r}}function bn(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 vt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>bn(n,r))}}var Gi=[{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"]}],ve=new Map,hn=new Map;for(let e of Gi){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};hn.set(e.name,t),ve.set(e.name,e.name);for(let n of e.aliases)ve.set(n,e.name)}function Wi(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 Rt(e){return ve.get(e)??e}function Yi(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 Re(e){return ve.get(e)}function pe(e=[]){let t=new Map,n=new Map(ve);for(let r of hn.values())t.set(r.canonical,{name:r.name,kind:r.kind,canonical:r.canonical,aliases:new Set([r.name,r.canonical,...r.aliases]),compatibleWith:new Set(r.compatibleWith),validate:r.validate,source:r.source});for(let r of e)for(let[i,o]of Object.entries(r.types??{})){let s=Rt(o.canonical??i),d=t.get(s)??Wi(i,s,o);d.name=i,d.kind=o.kind,d.canonical=s,d.source="augmentation",d.validate=o.validate??d.validate,d.aliases.add(i),d.aliases.add(s);for(let u of o.aliases??[])d.aliases.add(u);for(let u of o.compatibleWith??[])d.compatibleWith.add(u);t.set(s,d),n.set(i,s),n.set(s,s);for(let u of o.aliases??[])n.set(u,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(i=>n.get(i)??Rt(i))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,i])=>[r,Yi(i)])),namesToCanonical:n}}function U(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Rt(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ke(e,t){return U(e,t)?.canonical}function xe(e,t,n){let r=U(e,t),i=U(e,n);return!r||!i?!1:r.kind==="any"||i.kind==="any"||r.canonical===i.canonical?!0:r.compatibleWith.includes(i.canonical)||i.compatibleWith.includes(r.canonical)}function Tn(e,t){if(e.length<3)return!1;let n=0,r=e.length-1;for(;n<=r&&e[n]===" ";)n+=1;for(;n<=r&&e[r]===" ";)r-=1;let o=r-n+1>=3&&e[n]==="{"&&e[r]==="}";return o&&t&&(t.current=e.slice(n+1,r)),o}function vn(e){let t={};return Tn(e,t)?t.current:void 0}function z(e,t){return t==="{=}"||t==="="?e:vn(t)}var Rn=[{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:[]}],xn={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 kn=[{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:[]}],Dn={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 En=[{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:[]}],Nn={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 Cn=["4.6.2","4.8.2","4.9.0"],xt="4.9.0",ke={"4.6.2":{models:Rn,genericSubTreeModel:xn},"4.8.2":{models:kn,genericSubTreeModel:Dn},"4.9.0":{models:En,genericSubTreeModel:Nn}};var In=Cn.map(e=>`btcpp-v${e}`),De=["btcpp-v4",...In],Bn=`btcpp-v${xt}`;function Mn(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 Hi(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Mn)}))}function _n(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Mn)}}function Zi(){let e={};for(let[t,n]of Object.entries(ke))e[`btcpp-v${t}`]=Hi(n.models);return e}function Ji(){let e={};for(let[t,n]of Object.entries(ke))e[`btcpp-v${t}`]=_n(n.genericSubTreeModel);return e}var Qi=Zi(),eo=Ji();function to(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(ke,t)}function wn(e){return e==="btcpp-v4"?Bn:e}function no(e){return e==="btcpp-v4"?xt:e.replace(/^btcpp-v/,"")}function Pn(e){if(e&&e!=="btcpp-v4"&&!to(e))throw new Error(`unsupported builtin model set: ${e}`)}function kt(e="btcpp-v4"){Pn(e);let t=wn(e);return Qi[t].map(r=>An(r))}function Dt(e="btcpp-v4"){Pn(e);let t=eo[wn(e)]??_n(ke[no(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function An(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 Ee(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let r=t.name.localeCompare(n.name);if(r!==0)return r;let i=t.direction.localeCompare(n.direction);if(i!==0)return i;let o=(t.type??"").localeCompare(n.type??"");if(o!==0)return o;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function Ge(e,t){let n=Ee(e),r=Ee(t);return JSON.stringify(n)===JSON.stringify(r)}function Et(e,t){if(Ge(e,t))return"none";let n=Ee(e),r=Ee(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let i=new Map(r.ports.map(a=>[a.name,a])),o=!1,s=!1;for(let a of n.ports){let d=i.get(a.name);if(!d){s=!0;continue}(a.direction!==d.direction||a.type!==d.type||a.required!==d.required)&&(s=!0);let u=a.enum?JSON.stringify(a.enum):"",l=d.enum?JSON.stringify(d.enum):"";u!==l&&(s=!0),a.description!==d.description&&(s=!0),a.defaultValue!==d.defaultValue&&(o=!0)}return s?"ports":o?"port-default":"mixed"}import{z as M}from"zod";var Ln=M.object({direction:M.enum(["input","output","inout"]).optional(),type:M.string().optional(),required:M.boolean().optional(),default:M.string().optional(),description:M.string().optional(),enum:M.array(M.string()).optional()}).strict(),We=M.object({kind:M.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:M.record(M.string(),Ln).optional(),description:M.string().optional()}).strict(),ro=M.object({nodes:M.record(M.string(),We)}).strict();import{z as S}from"zod";var Un=S.enum(["off","info","warn","error"]),Vn=S.union([Un,S.tuple([Un,S.record(S.string(),S.unknown())])]),io=S.object({include:S.array(S.string()).optional(),ignore:S.array(S.string()).optional(),useGitignore:S.boolean().optional(),followSymlinks:S.boolean().optional(),maxSize:S.number().int().positive().optional()}).strict(),oo=S.string(),so=S.object({name:S.string(),attribute:S.string(),base:S.enum(["file","project-root"]).optional()}).strict(),ao=S.object({elements:S.array(so).optional(),variables:S.record(S.string(),S.string()).optional(),allowOutsideRoot:S.boolean().optional(),maxDepth:S.number().int().min(1).optional(),maxFiles:S.number().int().min(1).optional()}).strict(),lo=S.object({entrypoints:S.array(oo).optional(),includes:ao.optional(),behaviorTreeIds:S.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),uo=S.object({builtins:S.array(S.enum(De)).optional(),files:S.array(S.string()).optional(),augmentations:S.array(S.string()).optional(),definitions:S.array(S.string()).optional(),inline:S.record(S.string(),We).optional()}).strict(),On=S.object({inline:S.enum(["allow","deny"]).optional()}).strict(),co=S.object({enabled:S.boolean().optional(),rules:S.record(S.string(),Vn).optional(),baseline:S.string().optional(),suppressions:On.optional()}).strict(),po=S.object({rules:S.record(S.string(),Vn).optional(),suppressions:On.optional()}).strict(),qn=S.object({indentWidth:S.number().int().min(1).max(8).optional(),xmlDeclaration:S.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:S.boolean().optional(),lineEnding:S.enum(["lf","crlf","auto"]).optional()}).strict(),mo=S.object({files:S.array(S.string()),linter:po.optional(),formatter:qn.optional()}).strict(),Fn=S.object({$schema:S.string().optional(),strict:S.boolean().optional(),files:io.optional(),resolver:lo.optional(),models:uo.optional(),linter:co.optional(),formatter:qn.optional(),overrides:S.array(mo).optional()}).strict();function $n(e){return e.flatMap(fo)}function fo(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let o=Xn([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:o,message:`unknown config field \`${o}\``}});let n=Xn(e.path);return zn(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 Xn(e){return e.map(String).join(".")||void 0}function zn(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(jn);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(i=>i.issues??[]).some(jn):!1}function jn(e){return typeof e=="object"&&e!==null&&zn(e)}function Ne(e){let t=Fn.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:$n(t.error.issues)}}function go(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 yo(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 So(e){return e.map(t=>P(t.code,t.severity==="error"?b.Error:b.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function bo(e){let t=[],n=St(),{$schema:r,strict:i,overrides:o,...s}=e;i&&(n=Te(n,pn)),n=Te(n,s),n.overrides=(o??[]).map(d=>({files:d.files,linter:yo(d.linter),formatter:go(d.formatter)}));let a=!t.some(d=>d.severity===b.Error);return{config:n,diagnostics:t,ok:a}}function Nt(e){let t=Ne(e);return t.ok?bo(t.value):{ok:!1,config:St(),diagnostics:So(t.diagnostics)}}function Ct(){return{$schema:"./node_modules/@abco20/btxml-checker/schemas/btxml.config.schema.json"}}function ho(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 To(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),i=r?t.slice(1):t,s=ho(i).test(n);return r?!s:s}function Kn(e,t){return e.overrides.filter(n=>n.files.some(r=>To(t,r)))}function Ye(e){return e.replaceAll("\\","/")}function vo(e){try{return decodeURIComponent(e)}catch{return e}}function Gn(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=vo(t.pathname);return/^\/[A-Za-z]:/.test(n)?Ye(n.slice(1)):t.host?Ye(`//${t.host}${n}`):Ye(n)}function He(e,t){let n=Ye(t),r=Kn(e,n),i=e;for(let o of r)i=Te(i,{linter:o.linter,formatter:o.formatter});return{files:i.files,resolver:i.resolver,models:i.models,linter:i.linter,formatter:i.formatter}}function It(e,t){return He(e,Gn(t))}function me(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 Ze(e){if(typeof e=="string")return ze.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&ze.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let r={severity:t};return n!==void 0&&(r.options=n),r}}return null}function Wn(e,t){if(t)return Ke(e,t)}function Yn(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Hn(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return P(e.code,b.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Ro(e,t,n,r,i){let o=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:o,typeSource:n.typeSource??Yn(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},d=r.typeRefinement;if(!d)return{...a,type:a.effectiveType};let u=Wn(e,d.from),l=Wn(e,o);return u&&u!==l?(i.push(Hn({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${o??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:o,actualFrom:d.from,to:d.to},notes:o||d.from?[`base type: ${o??"(unspecified)"}`,`requested from: ${d.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:d.to,effectiveType:d.to,typeSource:"model-augmentation",typeRefinement:d}}function xo(e,t,n,r){let i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of Object.entries(n.ports??{})){let a=i.get(o);if(!a){r.push(Hn({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${o}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:o}}));continue}i.set(o,Ro(e,t,a,s,r))}return{...t,ports:t.ports.map(o=>i.get(o.name)??o)}}function ko(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Yn(e)}}function Zn(e,t,n){let r=[],i=new Map([...e.entries()].map(([o,s])=>[o,{...s,ports:s.ports.map(ko)}]));for(let o of n)for(let[s,a]of Object.entries(o.augment??{})){let d=i.get(s);if(!d){r.push(P("BT117_AUGMENT_TARGET_NOT_FOUND",b.Error,`augmentation target node \`${s}\` not found`,void 0,o.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:o.path?[`augmentation file: ${o.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:o.path}));continue}i.set(s,xo(t,d,a,r))}return{modelsById:i,diagnostics:r}}function er(e){return Ce("builtin",0,!1,e)}function tr(e){return Ce("xml-tree-nodes-model",10,!0,e)}function nr(e){return Ce("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function rr(e){return Ce("node-definition-file",20,!0,e)}function ir(e){return Ce("config-inline",30,!0,e)}function Ce(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(i=>or(i,e,n&&i.editable!==!1))}}function Do(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function or(e,t,n){let r=Do(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:r}))}}function fe(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 Jn(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 Eo(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let r=new Map(e.ports.map(o=>[o.name,o])),i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of r)i.has(o)||n.push({kind:"port-removed",portName:o,sourceIndex:0,port:Jn(s)});for(let[o,s]of i)r.has(o)||n.push({kind:"port-added",portName:o,sourceIndex:1,port:Jn(s)});for(let[o,s]of r){let a=i.get(o);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:o,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:o,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:o,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:o,left:s.defaultValue,right:a.defaultValue});let d=s.enum?JSON.stringify([...s.enum].sort()):"",u=a.enum?JSON.stringify([...a.enum].sort()):"";d!==u&&n.push({kind:"port-enum",portName:o,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:o,left:s.description,right:a.description})}return n}function Qn(e,t){let n=new Map;for(let r of e){let i=n.get(r.id);if(!i){n.set(r.id,r);continue}if(Ge(i,r))continue;let o=Et(i,r),s=Eo(i,r),a;if(o==="port-default"){let d=new Map(i.ports.map(p=>[p.name,p])),u=r.ports.find(p=>{let g=d.get(p.name);return g&&g.defaultValue!==p.defaultValue}),l=u?.name??"unknown",m=[fe(i,0),fe(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:l,sources:[{source:fe(i,0),value:d.get(l)?.defaultValue},{source:fe(r,1),value:u?.defaultValue}]},t.push({id:r.id,definitions:[i,r],sources:m,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${l}\` on node \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${r.id}\` definition or remove the duplicate model`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}else{let d=[fe(i,0),fe(r,1)];a={kind:"node-model-conflict",nodeId:r.id,sources:d,differences:s},t.push({id:r.id,definitions:[i,r],sources:d,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${r.id}\` model definitions agree, or keep only one definition at the same precedence level`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}}return n}function No(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(r=>[r.name,r]));for(let r of t.ports)n.set(r.name,r);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function sr(e){let t=[],n=new Map,r=new Map,i=[...e].sort((a,d)=>a.precedence-d.precedence),o=new Map,s=new Map;for(let a of i){let d=o.get(a.precedence)??[],u=a.models.map(l=>or(l,a.kind,a.editable&&l.editable!==!1));d.push(...u),o.set(a.precedence,d);for(let l of u)s.set(l.id,a.precedence)}for(let[a,d]of[...o.entries()].sort((u,l)=>u[0]-l[0])){let u=d.filter(g=>s.get(g.id)===a),l=d.filter(g=>s.get(g.id)!==a),m=Qn(l,[]);for(let[g,x]of Qn(u,t))m.set(g,x);let p=new Set(d.map(g=>g.id));for(let g of p)s.get(g)===a&&n.set(g,d.filter(x=>x.id===g));for(let[g,x]of m)r.set(g,No(r.get(g),x))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Co(e){return De.includes(e)}function Io(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:pe(),augmentations:[]}}function Bo(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function Mo(e,t,n){for(let r of new Set(n))if(Co(r)){for(let i of kt(r))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...Dt(r))}}function _o(e,t,n,r,i){for(let o of i){let s=bt(o,{uri:o.uri,path:o.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(o.uri,a);for(let d of a.behaviorTrees)Bo(e.behaviorTreesById,d.id,d);o.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function wo(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 Po(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let i=wo(r);t.has(i)||(t.add(i),n.push(r))}e.genericSubTreePorts=n}function Ao(e,t,n,r,i){e.modelLayers.push(er(t),tr(n),nr(r)),i.models?.length&&e.modelLayers.push(rr([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function Ie(e,t){return Lo(e,t)}function Lo(e,t){let n=Io(),r=[],i=[],o=[],s=[];Mo(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=pe(t.augmentations??[]),_o(n,r,o,s,e),Po(n),Ao(n,i,o,s,t);let a=t.config.models.inline;if(a){let l=[];for(let[m,p]of Object.entries(a))l.push(vt(m,p));n.modelLayers.push(ir(l))}let d=sr(n.modelLayers),u=Zn(d.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=d.nodeModelsById,n.mergedNodeModelsById=u.modelsById,n.modelConflicts=d.conflicts,r.push(...u.diagnostics),{ok:r.every(l=>l.severity!==b.Error),index:n,diagnostics:r}}var ar={unknownSubTreePorts:"allow"};function dr(e){return{...ar,...e}}var Uo=["Action","Condition","Control","Decorator"],Vo=new Set(Uo);var Oo=new Set(["input_port","output_port","inout_port"]);function Mt(e){return Vo.has(e)}function Je(e,t){return e.attributes.find(n=>n.name===t)?.value}function Bt(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&Bt(n,t))return!0;return!1}function lr(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return Bt(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&Bt(n,t))return!0;return!1}function Qe(e){return Oo.has(e.name)}function ur(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":Mt(e.name)?"generic-node":Qe(e)?"unknown-xml":"concrete-node"}function _t(e){if(e.name==="SubTree")return Je(e,"ID")||"SubTree";if(Mt(e.name))return Je(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||Qe(e)))return e.name}function V(e){return e.typeRegistry}function K(e,t){return U(V(e),t)}function ge(e,t,n){return xe(V(e),t,n)}function Be(e,t){return e.documents.get(t)}function te(e,t){return e.behaviorTreesById.get(t)??[]}function wt(e,t){return e.behaviorTreesById.has(t)}function Pt(e){return[...e.behaviorTreesById.keys()]}function At(e,t){return e.documents.has(t)}function Y(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Lt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Ut(e){return[...e.genericSubTreePorts]}function Vt(e){return[...e.augmentations]}function Me(e){return e.modelConflicts}function _e(e,t){let{id:n,fileLocalUri:r,config:i}=t,o=te(e,n);if(o.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let u=o.filter(l=>l.uri===r);u.length>0&&(o=u)}let a=Y(e,n),d=a?.kind==="SubTree"?[a]:[];return o.length===1?{status:"resolved",kind:"behavior-tree",treeId:o[0].id,behaviorTree:o[0]}:{status:"ambiguous",candidates:[...o.map(u=>u.id),...d.map(u=>u.id)],behaviorTrees:o,definitions:d}}let s=Y(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Ot(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Y(e,t);if(n){let i=Me(e).find(o=>o.id===t&&o.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let r=Lt(e,t);return r.length===1?{status:"resolved",model:r[0]}:r.length>1?{status:"ambiguous",nodeType:t,candidates:r}:{status:"unresolved",nodeType:t}}function qt(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Ft(e){let t=Ut(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return qt([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Xt(e){let{attribute:t}=e,n=e.ports.find(r=>r.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:ht(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 H(e,t){let n=dr(t.policy),r=t.element,i=ur(r),o=lr(t.documentRoot,r);if((t.isModelDefinition||o&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),o&&Qe(r)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:r,tagName:r.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=_t(r);if(i!=="subtree"){let g=Ot(e,s),x=Ft({index:e,tagForm:i,model:g}),T=r.attributes.map(N=>Xt({attribute:N,ports:x,allowsArbitraryAttributes:!1,model:g}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:g,ports:x,allowsArbitraryAttributes:!1,portUsages:T}}let a=Je(r,"ID"),d=a?_e(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},u={status:"unresolved",nodeType:a},l=!1;if(d.status==="resolved"&&d.kind==="node-model")u={status:"resolved",model:d.model};else if(d.status==="resolved"&&d.kind==="behavior-tree"){let g=Ot(e,d.treeId);g.status==="resolved"&&g.model.kind==="SubTree"?u=g:l=n.unknownSubTreePorts==="allow"}else d.status==="ambiguous"&&d.definitions.length>0?u=d.definitions.length===1?{status:"resolved",model:d.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:d.definitions}:l=n.unknownSubTreePorts==="allow";let m=Ft({index:e,tagForm:i,model:u,subtreeModelPorts:d.status==="ambiguous"?qt(d.definitions.flatMap(g=>g.ports)):void 0}),p=r.attributes.map(g=>Xt({attribute:g,ports:m,allowsArbitraryAttributes:l,model:u,unknownModelPortStatus:!l&&u.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:u,subtree:{id:a,target:d},ports:m,allowsArbitraryAttributes:l,portUsages:p}}function et(e,t){return H(e,t).portUsages.find(r=>r.name===t.attributeName)}function Xo(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function jo(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function cr(e,t){let n=e.line,r=e.character,i=e.offset;for(let o of t){if(i+=o.length,o===`
10
- `){n+=1,r=0;continue}r+=o.length}return{line:n,character:r,offset:i}}function $o(e,t,n){let r=cr(e,t),i=cr(r,n);return{start:r,end:i}}function zo(e,t){let n=t.valueContentRange||t.valueRange,r=e.originalText.slice(n.start.offset,n.end.offset),i=[];for(let o of r.matchAll(/\{([^}]+)\}/g)){let s=o[0],a=o[1],d=o.index??0;i.push({raw:s,key:a,range:$o(n.start,r.slice(0,d),s),syntax:"braced"})}return i.length===0&&(r.includes("{")||r.includes("}"))&&i.push({raw:r,key:r,range:n,syntax:"invalid"}),i}function Ko(e,t){return Xo(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function mr(e){let t=[];for(let n of e)t.push(n),t.push(...mr(n.children));return t}function Go(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 Wo(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 pr(e,t){return e.attributes.find(n=>n.name===t)}function Yo(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let i of r.children)i.kind==="element"&&n(i)};if(e.name==="TreeNodesModel")return n(e),t;for(let r of e.children)r.kind!=="element"||r.name!=="TreeNodesModel"||n(r);return t}function tt(e,t){let n=t.semantic,r=Yo(e.root),i=jo(e).map(d=>({id:pr(d,"ID")?.value,element:d,rootNode:void 0,nodes:[]})),o=[],s=[],a=(d,u,l,m)=>{let p=H(n,{element:d,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(d)}),g=Go(p),x={element:d,path:m,tagName:d.name,kind:Ko(d,p),model:g,usage:p,portBindings:[],children:[],parent:l,behaviorTree:u};if(x.portBindings=p.portUsages.filter(T=>T.status!=="reserved-attribute").map(T=>({name:T.name,value:T.value,attribute:T.attribute,declaredPort:Wo(T),usage:T,blackboardReferences:zo(e,T.attribute)})),x.children=d.children.filter(T=>T.kind==="element").map((T,N)=>a(T,u,x,[...m,N])),d.name==="SubTree"){let T=pr(d,"ID")?.value;o.push({node:x,id:T,target:p.subtree?.target??{status:"unresolved",id:T},portRemaps:x.portBindings})}return x};for(let d of i){let u=d.element.children.filter(l=>l.kind==="element").map((l,m)=>a(l,d,void 0,[m]));d.rootNode=u[0],d.nodes=mr(u),s.push(...d.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:o,nodes:s}}function fr(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function gr(e,t){return e.includeIssuesByUri.get(t)??[]}function yr(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Sr(e){let{document:t,semantic:n,config:r,view:i}=e,o=new Map(i.nodes.map(u=>[u.element,u])),s=new Map(i.subtreeCalls.map(u=>[u.node.element,u])),a=me(r),d=Zo(t.root);return{document:t,view:i,semantic:n,config:r,options:e.options,facts:e.facts,report(u){let l=P(u.code??e.code,e.severity,u.message,u.range,t.uri,u.details,u.data);e.diagnostics.push({...l,rule:e.rule,...u.relatedInformation?{relatedInformation:u.relatedInformation}:{}})},getIncludeIssues(u){let l=gr(e.facts,t.uri);return u?l.filter(m=>m.kind===u):l},getSuppressionIssues(u){let l=yr(e.facts,t.uri);return u?l.filter(m=>m.kind===u):l},getNodeUsage(u){return H(n,{element:u,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:d.has(u)})},getPortUsage(u,l){return et(n,{element:u,documentRoot:t.root,attributeName:l,uri:t.uri,config:r,policy:a,isModelDefinition:d.has(u)})},resolveSubTree(u,l){return _e(n,{id:u,fileLocalUri:l,config:r})},getNodeModel(u){return Y(n,u)},getBehaviorTrees(u){return te(n,u)},getTreeNodeView(u){return o.get(u)},getSubTreeCallView(u){return s.get(u)}}}function Zo(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return jt(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||jt(n,t);return t}function jt(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&jt(n,t)}function R(e){let t=cn[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Jo={"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 Z(e){return R({name:Jo[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Qo(n)})}}}})}function Qo(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 br=[Z("missing-path"),Z("not-found"),Z("cycle"),Z("outside-root"),Z("unresolved-variable"),Z("depth-exceeded"),Z("too-many-files"),Z("external-used")];import es from"ajv";var ts=es,ns=new ts,rs=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],is={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}},$t=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"]),hr=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 Tr(e){return e.children.filter(t=>t.kind==="element")}function O(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function vr(e){return e.children.some(t=>t.kind==="element")}function rt(e,t){let n=Rr(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Rr(e){let t=z(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 nt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return ls(e.registry,n,e.value)?void 0:nt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!kr(r,e.value))return os(r)?nt(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${r}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${r}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function ye(e){return e.effectiveType??e.type}function xr(e,t){return U(e,ye(t))}function zt(e,t){return z(e,t)}function nt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function os(e){let t=Re(e)??e;return Dr(e)!==void 0||us.has(t.toLowerCase())}function kr(e,t){let n=Dr(e);if(n)return ss(n,t);let r=(Re(e)??e).toLowerCase();switch(r){case"std::string":case"string":case"bt::any":case"bt::anytypeallowed":case"bt::anytype":case"any":return!0;case"bool":return t==="0"||t==="1"||t==="true"||t==="TRUE"||t==="True"||t==="false"||t==="FALSE"||t==="False";case"float":case"double":return/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/.test(t);case"bt::nodestatus":case"nodestatus":return rs.includes(t);default:return $t.has(r)||hr.has(r)?Er(r,t):!1}}function Dr(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function ss(e,t){let n=ds(t);return n?n.every(r=>as(e,r)):!1}function as(e,t){if(t.kind==="string")return kr(e,t.value);let n=(Re(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 $t.has(n)||hr.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Er(n,String(t.value)):!1}}function Er(e,t){let n=is[e];if(!n)return!1;if($t.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let r=BigInt(t);return r>=n.min&&r<=n.max}catch{return!1}}function ds(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 ls(e,t,n){switch(t.kind){case"pattern":return new RegExp(`^(?:${t.pattern})$`).test(n);case"enum":return t.values.includes(n);case"tuple":{let r=n.split(t.separator);return r.length!==t.items.length?!1:r.every((i,o)=>{let s=t.items[o];return s?Rr({port:{name:`tuple[${o}]`,type:s},value:i,registry:e,typeDefinition:U(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${o}]`})===void 0:!1})}case"json-schema":try{let r=JSON.parse(n);return ns.compile(t.schema)(r)===!0}catch{return!1}}}var us=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 Nr=[R({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})}}}}),R({name:"model/no-duplicate-port-name",meta:{description:"Ports with the same name are not allowed."},create(e){return{TreeNodeModel(t){let n=new Set;for(let r of t.ports)r.name&&(n.has(r.name)&&e.report({message:`Duplicate port name "${r.name}" in ${t.id}`,range:r.nameRange||r.range||t.idRange||t.range}),n.add(r.name))}}}}),R({name:"model/valid-port-name",meta:{description:"Port names must be valid XML attribute names for BT nodes."},create(e){return{TreeNodeModel(t){for(let n of t.ports){if(!n.name)continue;let r=Tt(n.name);r&&e.report({code:y.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),R({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of Me(e.semantic))t.uri&&t.uri!==e.document.uri||cs(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),R({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!ps(t))return;let n=t.attributes.find(d=>d.name==="default")??t.attributes.find(d=>d.name==="default_value");if(!n)return;let r=t.attributes.find(d=>d.name==="name")?.value;if(!r)return;let o=ms(e.document.root,t)?.attributes.find(d=>d.name==="ID")?.value;if(!o)return;let a=e.getNodeModel(o)?.ports.find(d=>d.name===r);if(a){if(a.direction==="output"){z(a.name,n.value)===void 0&&e.report({code:y.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}rt(e,{port:a,value:n.value,range:n.range,registry:V(e.semantic),typeDefinition:K(e.semantic,a.type),allowRemap:!0,diagnosticCode:y.InvalidPortDefaultValue,customLiteralDiagnosticCode:y.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),R({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=V(e.semantic),n=new Map,r=e.options.allowStringEntryCompatibility??!0;for(let i of e.view.nodes)for(let o of i.portBindings){if(o.declaredPort.status!=="resolved")continue;let s=zt(o.name,o.value);if(!s)continue;let a=xr(t,o.declaredPort.port);if(!a||a.kind==="any")continue;let d=n.get(s)??[];d.push({key:s,nodeId:ys(i.element),port:o.declaredPort.port,typeDefinition:a,range:o.attribute.range}),n.set(s,d)}for(let[i,o]of n){let s=fs(e.semantic,o,r);if(s.length<2)continue;let a=o.find(d=>d.typeDefinition.canonical===s[0]);e.report({code:y.BlackboardTypeMismatch,message:`blackboard entry \`${i}\` is used with incompatible port types: ${s.map(d=>`\`${d}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${i}\` mixes incompatible port types`,notes:o.filter(d=>s.includes(d.typeDefinition.canonical)).map(d=>`${d.nodeId}.${d.port.name} declares ${gs(d.port,d.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),R({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Ss(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&i.port.direction==="output"&&zt(i.port.name,r.value)===void 0&&e.report({code:y.OutputPortRequiresRemap,message:`output port \`${i.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${i.port.name}\` requires a blackboard remap`,help:`use \`${i.port.name}="{${i.port.name}}"\` or \`${i.port.name}="{some_key}"\``}})}}}}})];function cs(e,t){return e.diagnostics.some(n=>n.code===y.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function ps(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function ms(e,t){if(!e)return;return n(e,!1,void 0);function n(r,i,o){let s=i||r.name==="TreeNodesModel",a=s&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:o;if(r===t)return a;for(let d of r.children){if(d.kind!=="element")continue;let u=n(d,s,a);if(u)return u}}}function fs(e,t,n){let r=new Set;for(let i=0;i<t.length;i+=1){let o=t[i];if(o)for(let s=i+1;s<t.length;s+=1){let a=t[s];a&&(n&&(o.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||ge(e,o.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(o.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function gs(e,t){return ye(e)??t.canonical}function ys(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Ss(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var bs=new Set(["_failureIf","_successIf","_skipIf","_while"]),hs=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Kt(e){if(bs.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(hs.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}var Cr=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Ir=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function Br(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Mr(r)){n++;continue}if(Gt(r)){let a=n;for(n++;n<e.length&&Rs(e[n]);)n++;let d=e.slice(a,n);t.push({type:d==="true"||d==="false"?"Boolean":"Identifier",text:d,start:a,end:n});continue}if(ne(r)){let a=vs(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=Ts(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),o=Cr.get(i);if(o){t.push({type:o,text:i,start:n,end:n+2}),n+=2;continue}let s=Ir.get(r);if(s){t.push({type:s,text:r,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:r,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function Ts(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 vs(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&&xs(e[n]);)n++;return i===n||Ds(e,n)?(n=we(e,n),Pe(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&ne(e[n]);)n++;let r="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:r,text:e.slice(t,n),start:t,end:n};if(!ne(e[n+1]))return n=we(e,n+1),Pe(e,t,n);for(r="Real",n+=1;n<e.length&&ne(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let o=n;for(;n<e.length&&ne(e[n]);)n++;if(o===n)return n=we(e,Math.max(n,i+1)),Pe(e,t,n);r="Real"}return ks(e,n)?(n=we(e,n),Pe(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function we(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Mr(r)||Ir.has(r)||Cr.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Pe(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Mr(e){return e===" "||e===" "||e===`
11
- `||e==="\r"}function Gt(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Rs(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function ne(e){return e!==void 0&&/[0-9]/.test(e)}function xs(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function ks(e,t){let n=e[t];return Gt(n)||ne(n)}function Ds(e,t){let n=e[t];return n==="."||Gt(n)||ne(n)}var Es=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Ns=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),_r=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),L={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Le(e){let t=Br(e),n=t.filter(r=>r.type==="Error");return n.length>0?{ok:!1,errors:n.map(r=>({kind:"invalid-token",message:`invalid token \`${r.text}\``,range:{start:r.start,end:r.end}})),tokens:t}:wr(t,e)}function wr(e,t=""){let n=new Wt(e,t),r=[];if(n.peek().type==="EndOfInput")return{ok:!1,errors:[{kind:"empty-script",message:"empty script",range:{start:0,end:0}}],tokens:e};for(;n.peek().type!=="EndOfInput";){let o=n.parseExpression(0);if(!o)return{ok:!1,errors:n.errors,tokens:e};for(r.push(o);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let i=_s(r);return{ok:!0,program:{kind:"Program",statements:r,range:i},tokens:e}}var Wt=class{constructor(t,n,r=0){this.tokens=t;this.source=n;this.index=r}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let r=this.peek();if(r.type==="EndOfInput"||r.type==="Semicolon"||r.type==="RightParen"||r.type==="Colon")break;let i=Es.get(r.type);if(i){if(t>=L.assignment)break;this.consume();let d=this.parseExpression(0);if(!d)return;n={kind:"AssignmentExpression",operator:i,left:n,right:d,range:Ae(n.range,d.range)};break}if(r.type==="Question"){if(t>=L.ternary)break;this.consume();let d=this.parseExpression(0);if(!d)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let u=this.parseExpression(L.ternary);if(!u)return;n={kind:"ConditionalExpression",condition:n,thenExpression:d,elseExpression:u,range:Ae(n.range,u.range)};break}let o=_r.get(r.type);if(o){if(t>=L.comparison)break;this.consume();let d=[n],u=[o],l=this.parseExpression(L.comparison);if(!l)return;for(d.push(l);;){let m=_r.get(this.peek().type);if(!m)break;this.consume();let p=this.parseExpression(L.comparison);if(!p)return;u.push(m),d.push(p)}n={kind:"ComparisonChain",operands:d,operators:u,range:Ae(d[0].range,d[d.length-1].range)};continue}let s=Ns.get(r.type),a=s?Bs(r.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let d=this.parseExpression(a);if(!d)return;n={kind:"BinaryExpression",operator:s,left:n,right:d,range:Ae(n.range,d.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${r.text||r.type}\``,r);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:re(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),Cs(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Is(t.type),argument:n,range:Ae(re(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),r=this.parseExpression(0);if(!r)return;let i=this.peek();if(i.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",i);return}return this.consume(),Ms(r,{start:n.start,end:i.end})}default:this.reportError("expected-operand","expected operand",t);return}}peek(){return this.tokens[this.index]??this.tokens[this.tokens.length-1]}consume(){let t=this.peek();return this.index+=1,t}match(t){return this.peek().type!==t?!1:(this.consume(),!0)}reportError(t,n,r){this.errors.push({kind:t,message:n,range:re(r)})}};function Cs(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:re(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:re(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:re(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:re(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Is(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Bs(e){switch(e){case"PipePipe":return L.pipePipe;case"AmpAmp":return L.ampAmp;case"Pipe":case"Caret":return L.pipeCaret;case"Ampersand":return L.ampersand;case"Plus":case"Minus":case"DotDot":return L.additive;case"Star":case"Slash":return L.multiplicative;default:return}}function re(e){return{start:e.start,end:e.end}}function Ae(e,t){return{start:e.start,end:t.end}}function Ms(e,t){return{...e,range:t}}function _s(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var ws=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 Yt(e={}){let t=pe(e.augmentations??[]),n=e.areTypesCompatible??((o,s)=>xe(t,o,s)),r=new Map,i={symbols:new Map,enums:Ps(e.enums,e.augmentations??[])};for(let o of e.symbols??[])As(i,r,o,n);return i}function ie(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function Ht(e){let t=ie(e.baseEnvironment),n=[];for(let r of e.entries){let i=ie(t),o=r.parseResult??Le(r.source),s=ie(i),a;o.ok&&(a=Ue({program:o.program,environment:i,attributeName:r.attributeName,originId:r.originId??String(r.id)}),s=ie(a.environment)),n.push({id:r.id,parseResult:o,environmentBefore:i,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.enums.clear();for(let[d,u]of s.symbols)t.symbols.set(d,{...u});for(let[d,u]of s.enums)t.enums.set(d,u)}return n}function Pr(e){let t=new Map;for(let n of e)for(let[r,i]of Object.entries(n.script?.enums??{}))t.set(r,i);return t}function it(e,t){let n=U(e,t);return Ar(t,n)}function Ar(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"}:ws.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function Lr(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 ot(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 oe(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Zt(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 Ps(e,t){if(e instanceof Map)return new Map(e);let n=Pr(t??[]);for(let[r,i]of Object.entries(e??{}))n.set(r,i);return n}function As(e,t,n,r){let i=e.symbols.get(n.name);if(!i){e.symbols.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let o=t.get(n.name),s=i.conflict===!0||o!==void 0&&n.compatibilityKey!==void 0&&!r(o,n.compatibilityKey)||!Lr(i.type,n.type);e.symbols.set(n.name,{...i,readable:i.readable||n.readable,writable:i.writable||n.writable,conflict:s}),o===void 0&&t.set(n.name,n.compatibilityKey)}var se={kind:"number"},at={kind:"string"},st={kind:"bool"},G={kind:"unknown"},_={kind:"error"};function Ue(e){let t=ie(e.environment),n=[],r=[],i=[],o=[],s=[],a=[];return e.program.statements.forEach((d,u)=>{a.push(j({expression:d,statementIndex:u,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,statementTypes:a,finalType:a.at(-1)}}function j(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?se:t.valueKind==="string"?at:t.valueKind==="boolean"?st:G;case"Identifier":return Us(e,t.name,t.range);case"UnaryExpression":{let n=j({...e,expression:t.argument});return t.operator==="!"?oe(n)?st:(q(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"),_):n.kind==="number"?se:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?_:G:(q(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"),_)}case"BinaryExpression":{let n=j({...e,expression:t.left}),r=j({...e,expression:t.right});switch(t.operator){case"&&":case"||":return Ur(n)||Ur(r)?(q(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"),_):st;case"+":return n.kind==="string"&&r.kind==="string"?at:n.kind==="number"&&r.kind==="number"?se:Jt(n,r)?G:(Qt(e,t.range,t.operator),_);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?se:Jt(n,r)?G:(Qt(e,t.range,t.operator),_);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?at:Jt(n,r)?G:(Qt(e,t.range,t.operator),_)}return G}case"ComparisonChain":{let n=t.operands.map(r=>j({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let i=t.operators[r],o=n[r],s=n[r+1];if(!Os(i,o,s))return q(e,"invalid-operand-type",{start:t.operands[r]?.range.start??t.range.start,end:t.operands[r+1]?.range.end??t.range.end},`operator \`${i}\` cannot compare these operand types`,`comparison operands for \`${i}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),_}return st}case"ConditionalExpression":{let n=j({...e,expression:t.condition});oe(n)||q(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let r=j({...e,expression:t.thenExpression}),i=j({...e,expression:t.elseExpression}),o=Zt(r,i);return o||(q(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"),_)}case"AssignmentExpression":return Ls(e)}}function Ls(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:i}=e,o=e.expression,s=j({...e,expression:o.right});if(o.left.kind!=="Identifier")return j({...e,expression:o.left}),q(e,"invalid-operand-type",o.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),_;let a=o.left,d=o.operator===":="?"declare":o.operator==="="?"write":"readwrite",u={name:a.name,kind:d,range:a.range,identifier:a,statementIndex:e.statementIndex};r.push(u);let l=t.symbols.get(a.name);if(o.operator===":="&&!l){let p={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,p),e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:p}}),i.push(p),s}if(!l)return e.resolvedIdentifiers.push({access:u,resolution:{kind:"unknown"}}),q(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"),_;if(e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:l}}),o.operator==="=")return ot(l.type,s)?(en(l,s),s):(Vr(e,a,l.type,s),_);if(o.operator===":=")return ot(l.type,s)?(en(l,s),s):(Vr(e,a,l.type,s),_);let m=Vs(l.type,s,o.operator);return m?(en(l,m),m):(q(e,"invalid-compound-assignment",o.range,`operator \`${o.operator}\` is not valid for these operand types`,`compound assignment \`${o.operator}\` is not allowed here`,o.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),_)}function Us(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),se;let o=e.environment.symbols.get(t);return o?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:o}}),o.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),G)}function Vs(e,t,n){return e.kind==="error"||t.kind==="error"?_:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?G:n==="+="?e.kind==="number"&&t.kind==="number"?se:e.kind==="string"&&t.kind==="string"?at:void 0:e.kind==="number"&&t.kind==="number"?se:void 0}function Jt(e,t){return dt(e)||dt(t)}function dt(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Ur(e){return!oe(e)}function Os(e,t,n){return dt(t)||dt(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 Qt(e,t,n){q(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 Vr(e,t,n,r){q(e,"variable-type-mismatch",t.range,`cannot assign ${tn(r)} to variable \`${t.name}\` of type ${tn(n)}`,`\`${t.name}\` expects ${tn(n)} here`,"assign a compatible value or change the variable's source type")}function en(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 q(e,t,n,r,i,o){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:i,help:o}})}function tn(e){return e.kind==="custom"?e.name:e.kind}var Or=new WeakMap;function lt(e,t){let n=e.getNodeUsage(t),r=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(i=>{let o=Kt({elementName:t.name,attributeName:i.name,resolvedNodeType:r});return o?[{attribute:i,info:o,parseResult:Le(i.value)}]:[]})}function F(e,t,n){return yt(e.document,t,n)}function qr(e){return{start:0,end:e.value.length}}function J(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?lt(e,t).map(i=>{let o=Fr(e,[]);return{...i,environment:o,analysis:i.parseResult.ok?Ue({program:i.parseResult.program,environment:o,attributeName:i.attribute.name}):void 0}}):qs(e,r).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function qs(e,t){let n=Or.get(e.view);n||(n=new WeakMap,Or.set(e.view,n));let r=n.get(t);if(r)return r;let i=t.nodes.flatMap(s=>lt(e,s.element).map((a,d)=>({id:`${s.path.join(".")}:${a.attribute.name}:${d}`,node:s,candidate:a}))),o=Ht({baseEnvironment:Fr(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 d=i[a];return d?[{...s,node:d.node,candidate:d.candidate}]:[]});return n.set(t,o),o}function Fr(e,t){let n=V(e.semantic),r=[],i=t[0]?.behaviorTree.id;if(i){let o=e.getNodeModel(i);if(o?.kind==="SubTree")for(let s of o.ports){let a=ye(s),u=K(e.semantic,a)?.canonical??a;r.push({name:s.name,type:it(n,a),source:{kind:"subtree-port",nodeType:i,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:u})}}for(let o of t){let s=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let a of o.portBindings){if(a.usage.status!=="resolved")continue;let d=z(a.usage.port.name,a.usage.value);if(!d)continue;let u=ye(a.usage.port),m=K(e.semantic,u)?.canonical??u,p=a.usage.port.direction;r.push({name:d,type:it(n,u),source:{kind:"port-remap",nodeType:s,portName:a.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:m})}}return Yt({symbols:r,augmentations:Vt(e.semantic),areTypesCompatible:(o,s)=>o&&s?ge(e.semantic,o,s):!0})}var Xr=R({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:y.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:F(e,n.attribute,r.range),details:{primaryLabel:`\`${r.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var jr=R({name:"script/valid-assignment",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let i=r.code==="assignment-to-unknown-variable"?y.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?y.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?y.ScriptVariableTypeMismatch:void 0;i&&e.report({code:i,message:r.message,range:F(e,n.attribute,r.range),details:r.details})}}}}});var $r=R({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:y.InvalidScriptOperandType,message:r.message,range:F(e,n.attribute,r.range),details:r.details})}}}});var zr=R({name:"script/valid-result-type",create(e){return{Element(t){for(let n of J(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let r=n.parseResult.program.statements.at(-1),i=n.analysis.finalType;!r||!i||oe(i)||e.report({code:y.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:F(e,n.attribute,r.range),details:{primaryLabel:"script result is not bool-compatible here",help:"return a boolean or numeric expression, or move side effects into a postcondition/script node"}})}}}}});var Kr=R({name:"script/valid-syntax",create(e){return{Element(t){for(let n of lt(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let i=r.kind==="empty-script"?y.EmptyScript:r.kind==="invalid-token"?y.InvalidScriptToken:y.InvalidScriptSyntax;e.report({code:i,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??F(e,n.attribute,qr(n.attribute)):F(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Gr=[Kr,Xr,jr,$r,zr];var Fs={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Wr(e){return R({name:Fs[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Xs(n)})}}}})}function Xs(e){return e.code?{code:e.code}:void 0}var Yr=[Wr("unused"),Wr("missing-reason")];function ut(e,t){return e.attributes.find(n=>n.name===t)}var Hr=[R({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||ut(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),R({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Be(e.semantic,e.document.uri);for(let r of n?.behaviorTrees??[])r.idRange&&(t.has(r.id)&&e.report({message:`Duplicate BehaviorTree ID: ${r.id}`,range:r.idRange}),t.add(r.id))}}}}),R({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=te(e.semantic,t);if(n.length<=1||new Set(n.map(o=>o.uri)).size<=1)continue;let i=n.filter(o=>o.uri===e.document.uri);i.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:i[0]?.idRange})}}}}}),R({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=ut(t,"main_tree_to_execute");!n?.value||wt(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),R({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(o=>o.name==="ID")??ut(t,"ID");!r||n?.target.status==="resolved"||e.resolveSubTree(r.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${r.value}\``,range:r.valueContentRange||r.valueRange})}}}}),R({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=ut(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})}}}}),R({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var js=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function $s(e,t){return e===t?String(e):`${e}\u2013${t}`}var Zr=R({name:"model/valid-child-count",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&zs(e,t,n.model.model.id,n.model.model.kind)}}}});function zs(e,t,n,r){let i=Tr(t).length,o=js.get(n);if(o){if(i<o.min||i>o.max){let s=$s(o.min,o.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${i}.`,range:t.range})}return}if(r==="Action"||r==="Condition"){i>0&&e.report({message:`${r} node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range});return}if(r==="Decorator"){i!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${i}.`,range:t.range});return}if(r==="Control"){i<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}r==="SubTree"&&i>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range})}var Jr=R({name:"model/valid-port-value",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&rt(e,{port:i.port,value:r.value,range:r.range,registry:V(e.semantic),typeDefinition:K(e.semantic,i.port.type),allowRemap:!0,diagnosticCode:y.InvalidPortValueType,customLiteralDiagnosticCode:y.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Qr=R({name:"model/require-port",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports)!r.required||n.portUsages.some(o=>o.name===r.name&&o.status==="resolved")||e.report({message:`missing required port \`${r.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${r.name}\``:`SubTree requires port \`${r.name}\``,help:`add \`${r.name}="..."\` or provide a blackboard reference such as \`${r.name}="{value}"\``}:void 0})}}}});var ei=[R({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(O(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Control"&&r!=="Decorator"||e.report({message:`${r} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),R({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(O(t)||t.selfClosing||vr(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Action"&&r!=="Condition"&&r!=="SubTree"||e.report({message:`${r} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var ti=R({name:"model/no-unknown-node",create(e){return{Element(t){let n=e.getNodeUsage(t);if(n.tagForm==="root"||n.tagForm==="behavior-tree"||n.tagForm==="tree-nodes-model"||n.tagForm==="include"||n.tagForm==="model-definition"||n.tagForm==="subtree"||n.tagForm==="unknown-xml"||n.model.status==="resolved"||n.model.status==="ambiguous")return;let r=t.attributes.find(i=>i.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:r?.valueContentRange??r?.valueRange??t.range})}}}});var ni=R({name:"model/no-unknown-port",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let i=n.ports.map(s=>s.name).sort(),o=i.length>=1&&i.length<=8?[`note: defined ports: ${i.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${r.name}\``,range:r.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${r.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${r.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:o}:void 0})}}}}});var ri=[ti,ni,Qr,Jr,...ei,Zr];function Ks(e,t){return e.attributes.find(n=>n.name===t)}function Gs(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var ii=[R({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:y.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||Ks(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},R({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)||Gs(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var nn=[...ii,...Gr,...Hr,...Nr,...ri,...br,...Yr],yp=new Map(nn.map(e=>[e.name,e]));function oi(e){if(e!=="off")return e==="info"?b.Info:e==="warn"?b.Warning:b.Error}function si(e,t){return Ze(e.linter.rules[t])?.options??{}}function ai(e){let t=Ze(e.config.linter.rules[e.rule]);return oi(t?t.severity:e.defaultSeverity)}function di(e){let t=[],n=e.facts??fr(),r=e.rules?new Set(e.rules):void 0,i=[];for(let s of nn){if(r&&!r.has(s.name))continue;let a=ai({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let d=si(e.config,s.name),u=s.optionsSchema?.safeParse(d),l=u?.success?u.data:d,m=Sr({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:l,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});i.push(s.create(m))}for(let s of i)s.Document?.();e.document.root&&li(e.document.root,i);let o=Be(e.semantic,e.document.uri);for(let s of o?.treeNodesModel??[])for(let a of i)a.TreeNodeModel?.(s);for(let s of i)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Ws(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function li(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&li(n,t)}function Ws(e,t){let n=e.range,r=t.range;return!n&&!r?0:n?r?n.start.line-r.start.line||n.start.character-r.start.character||n.end.line-r.end.line||n.end.character-r.end.character:-1:1}function ae(e,t){let n=ee(e,{uri:t.uri,path:t.path});if(!n.ok||!n.document)return{ok:!1,diagnostics:[...n.diagnostics]};let r=n.document,i=Ie([r],{config:t.config,augmentations:t.augmentations}),o=tt(r,{semantic:i.index,config:t.config,policy:me(t.config)}),s=di({document:r,view:o,semantic:i.index,config:t.config}),a=[...n.diagnostics,...i.diagnostics,...s];return{ok:!a.some(d=>d.severity===b.Error),diagnostics:a}}function ui(e,t){let n=ae(e,{config:t.config,uri:t.uri,path:t.path}),r=[...n.diagnostics],i,o=!1,s=!1;if(t.format!==!1){let d=he(e,t.config.formatter);r.push(...d.diagnostics),d.ok&&d.skipped?s=!0:d.ok&&!d.skipped&&(i=d.text,o=d.changed)}return n.ok&&!o&&r.every(d=>d.severity!=="error")?{ok:!0,diagnostics:r,formattedText:i,needsFormat:!1,skipped:s}:{ok:!1,diagnostics:r,formattedText:i,needsFormat:o,skipped:s}}function ci(e,t){return!e.isBtXml}async function pi(e){let t=e.inputs.map(s=>{let a=ee(s.text,{uri:s.uri,path:s.path,kind:s.kind});return{input:s,result:a}}),n=t.flatMap(({result:s})=>s.document&&!ci(s.document,e)?[s.document]:[]),r=Ie(n,{config:e.config}),i=t.map(({input:s,result:a})=>{let d=a.document;if(!a.ok)return{uri:s.uri,path:s.path,diagnostics:a.diagnostics,skipped:!1,formatted:!1};if(d&&ci(d,e))return{uri:s.uri,path:s.path,diagnostics:[],skipped:!0,skipReason:"not detected as BT XML",formatted:!1};let u=d&&At(r.index,d.uri)?ae(s.text,{config:e.config,uri:s.uri,path:s.path}).diagnostics:a.diagnostics;return{uri:s.uri,path:s.path,diagnostics:u,skipped:!1,formatted:!1}}),o={files:i.length,errors:r.diagnostics.filter(s=>s.severity===b.Error).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Error).length,warnings:r.diagnostics.filter(s=>s.severity===b.Warning).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Warning).length,infos:r.diagnostics.filter(s=>s.severity===b.Info).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Info).length};return{ok:o.errors===0,files:i,projectDiagnostics:r.diagnostics,summary:o}}import{z as c}from"zod";var mi=c.object({line:c.number(),character:c.number(),offset:c.number()}).strict(),rn=c.object({start:mi,end:mi}).strict(),Ys=c.object({primaryLabel:c.string().optional(),help:c.string().optional(),notes:c.array(c.string()).optional()}).strict(),Hs=c.object({uri:c.string(),range:rn,message:c.string()}).strict(),fi=c.object({code:c.string(),rule:c.string().optional(),severity:c.enum(["error","warning","info"]),message:c.string(),uri:c.string(),range:rn.optional(),relatedInformation:c.array(Hs).optional(),suppressed:c.boolean().optional(),details:Ys.optional(),data:c.record(c.string(),c.unknown()).optional()}).strict(),Zs=c.object({path:c.string(),diagnostics:c.array(fi),needsFormat:c.boolean().optional(),skipped:c.boolean().optional(),skipReason:c.string().optional()}).strict(),Js=c.object({ok:c.boolean(),version:c.literal(2),schemaVersion:c.literal("2"),toolVersion:c.string(),project:c.record(c.string(),c.unknown()),projectDiagnostics:c.array(fi),files:c.array(Zs),summary:c.object({files:c.number(),errors:c.number(),warnings:c.number(),infos:c.number(),suppressed:c.number(),baselineFiltered:c.number()}).strict()}).strict(),ct=c.object({definitionId:c.string(),uri:c.string().optional(),range:rn.optional()}).strict(),Qs=ct.extend({sourceKind:c.string(),kind:c.string(),signatureId:c.string(),signatureText:c.string()}).strict(),ea=c.object({id:c.string(),signatureKey:c.string(),signatureText:c.string(),definitions:c.array(ct),editableDefinitions:c.array(ct),nonEditableDefinitions:c.array(ct)}).strict(),ta=c.object({files:c.number(),definitions:c.number(),edits:c.number(),affectedUris:c.array(c.string())}).strict(),na=c.object({id:c.string(),title:c.string(),description:c.string(),kind:c.enum(["match-signature","keep-model-definition","keep-port-definition","manual","skip"]),applicable:c.boolean(),targetSignatureId:c.string().optional(),editSummary:ta,workspaceEdits:c.array(c.unknown()).optional(),usageImpact:c.unknown().optional(),warnings:c.array(c.string()).optional()}).strict(),ra=c.object({nodeId:c.string(),totalUsages:c.number(),byPort:c.record(c.string(),c.unknown())}).strict(),ia=c.object({key:c.string(),label:c.string()}).strict(),oa=c.object({id:c.string(),kind:c.enum(["model-signature-conflict","duplicate-model-id","duplicate-port-name"]),nodeId:c.string(),portName:c.string().optional(),displayName:c.string(),codes:c.array(c.string()),severity:c.enum(["error","warning"]),pairwiseConflictCount:c.number(),definitions:c.array(Qs),signatures:c.array(ea),differences:c.array(c.unknown()),usageEvidence:ra,usageImpacts:c.array(c.unknown()),differencePattern:ia,actions:c.array(na)}).strict(),sa=c.object({ok:c.boolean(),version:c.literal(2),schemaVersion:c.literal("2"),toolVersion:c.string(),groups:c.array(oa),summary:c.object({groups:c.number(),signatureConflictGroups:c.number(),duplicateModelGroups:c.number(),duplicatePortGroups:c.number(),pairwiseSignatureConflicts:c.number(),errors:c.number(),warnings:c.number()}).strict()}).strict();export{pi as checkBtWorkspace,ui as checkBtXml,Ct as createInitConfig,he as formatBtXml,He as getEffectiveConfigForFile,It as getEffectiveConfigForUri,Js as jsonCheckReportSchema,sa as jsonRepairReportSchema,Nt as normalizeBtxmlConfig,Ne as parseBtxmlConfig,ae as validateBtXml};
8
+ `);let l=a.join(u),m=u.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${m})+$`,"u"),x=`${l.replace(p,"")}${u}`;return{ok:!0,text:x,changed:x!==e,skipped:!1,diagnostics:n.diagnostics.filter(T=>T.severity!==b.Error)}}function gt(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 yt(e,t,n){let r=t.valueContentRange??t.valueRange,i=gt(t,n.start),o=gt(t,n.end),s=C(e.originalText,r.start.offset+i),a=C(e.originalText,r.start.offset+o);return v(s,a)}import{z as $e}from"zod";var y={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},za=Object.values(y).sort();var Ei=$e.object({subTreePorts:$e.enum(["loose","strict"]).optional()}).strict(),Ni=$e.object({allowStringEntryCompatibility:$e.boolean().optional()}).strict(),cn={"script/valid-syntax":{code:y.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:y.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:y.AssignmentToUnknownVariable,codes:[y.AssignmentToUnknownVariable,y.InvalidCompoundAssignment,y.ScriptVariableTypeMismatch],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:y.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:y.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:y.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:y.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:y.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:y.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:y.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:y.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:y.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:y.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:y.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:y.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:y.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:y.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:y.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:y.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:y.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:y.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:y.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:y.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:y.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:y.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:y.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:y.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:y.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:y.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:y.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:y.UnknownPort,defaultSeverity:"warn",optionsSchema:Ei,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:y.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:y.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:Ni,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:y.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:y.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:y.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:y.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:y.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:y.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:y.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:y.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var ze=["off","info","warn","error"];var pn={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"}}},Ci={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 St(){return structuredClone(Ci)}function Te(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 Ii={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Bi(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function X(e,t){return e.attributes.find(n=>n.name===t)}function Mi(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function _i(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function wi(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function mn(e,t,n){for(let r of e.attributes||[]){let i=[...String(r.value).matchAll(/\{([^}]+)\}/g)];for(let o of i){let s=o.index??0,a=r.valueRange.start,d={...a,character:a.character+o[0].length,offset:a.offset+s+o[0].length};t.push({name:o[1],attributeName:r.name,element:e,uri:n,range:{start:{...a,character:a.character+s,offset:a.offset+s},end:d}})}}for(let r of e.children||[])r.kind==="element"&&mn(r,t,n)}function Pi(e,t,n,r){let i=[];for(let o of e.children||[]){if(o.kind!=="element"||!Mi(o.name))continue;let s=X(o,"ID");if(!s)continue;let a=[];for(let d of o.children||[]){if(d.kind!=="element"||d.name!=="input_port"&&d.name!=="output_port"&&d.name!=="inout_port")continue;let u=X(d,"name"),l=X(d,"type"),m=X(d,"default")||X(d,"default_value"),p=X(d,"enum"),g=(d.children||[]).filter(N=>N.kind==="text").map(N=>N.text).join("").trim()||void 0,x=d.name==="input_port"?"input":d.name==="output_port"?"output":"inout",T=(x==="input"||x==="inout")&&m===void 0;a.push({source:n,direction:x,name:u?u.value:"",type:l?.value||void 0,defaultValue:m?.value||void 0,description:g,required:T,element:d,uri:t,range:d.range,nameRange:u?.range,enum:p?.value?p.value.split(";"):void 0})}i.push({id:s.value,kind:o.name,source:n,sourceMeta:{sourceKind:n,file:t,range:o.range},editable:r,ports:a,element:o,uri:t,range:o.range,elementRange:o.range,idRange:s.range})}return i}function Ai(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let i=X(r,"ID");i&&n.push({id:i.value,kind:"BehaviorTree",uri:t,element:r,range:r.range,elementRange:r.range,idRange:i.range})}return n}function Li(e,t){let n=[],r=(i,o)=>{let s=i.name==="BehaviorTree"?X(i,"ID")?.value??o:o;if(i.name==="SubTree"){let a=X(i,"ID");a&&n.push({id:a.value,uri:t,element:i,range:i.range,elementRange:i.range,idRange:a.range,parentBehaviorTreeId:s,attributes:i.attributes})}for(let a of i.children||[])a.kind==="element"&&r(a,s)};for(let i of e.children||[])i.kind==="element"&&r(i);return n}function Ui(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function fn(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 Vi(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(fn),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 Oi(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function qi(e){return{name:e.name,attributeName:e.attributeName,uri:e.uri,range:e.range}}function Fi(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Ui),subtreeReferences:e.subtreeReferences.map(Oi),blackboardReferences:e.blackboardReferences.map(qi),treeNodesModel:e.treeNodesModel.map(Vi),genericSubTreePorts:e.genericSubTreePorts.map(fn),rootMainTreeToExecute:_i(e.rootMainTreeToExecute)}}function Xi(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function ji(e){return P(Ii.DuplicateNodeModelId,b.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 $i(e,t){let n=[],r=t?.uri||e.uri,i=e.root,o=e.isBtXml,s=Bi(e),a=wi(e),d=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=i&&e.kind!=="model-document"?Ai(i,r):[],l=[],m=[],p=i?i.name==="TreeNodesModel"?[i]:i.children.filter(I=>I.kind==="element"&&I.name==="TreeNodesModel"):[];for(let I of p){let W=Pi(I,r,a,d),A=new Map;for(let B of W)Xi({node:B,treeNodesModel:l,genericSubTreePorts:m})||(A.has(B.id)?n.push(ji(B)):A.set(B.id,B))}let g=i?Li(i,r):[],x=i?(()=>{let I=[];return mn(i,I,r),I})():[],T=i?X(i,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Fi({uri:r,path:t?.path??e.path,isBtXml:o,kind:s,behaviorTrees:u,subtreeReferences:g,blackboardReferences:x,treeNodesModel:l,genericSubTreePorts:m,rootMainTreeToExecute:T?{uri:r,range:T.range,value:T.value}:void 0}),extractedBehaviorTrees:u,extractedTreeNodesModel:l,extractedSubTreeReferences:g,extractedBlackboardReferences:x},diagnostics:n}}function gn(e,t){let{extracted:n,diagnostics:r}=$i(e,t);return{model:n.publicModel,diagnostics:r}}function bt(e,t){return gn(e,t)}var yn=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),zi=new Set([...yn,"_autoremap","_description","__shared_blackboard"]),Ki=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 ht(e){return yn.has(e)}function Sn(e){return zi.has(e)}function Tt(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(Sn(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===`
9
+ `||t==="\r")return"port names must not contain whitespace";let r=Ki.get(t);if(r)return r}}function bn(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 vt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>bn(n,r))}}var Gi=[{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"]}],ve=new Map,hn=new Map;for(let e of Gi){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};hn.set(e.name,t),ve.set(e.name,e.name);for(let n of e.aliases)ve.set(n,e.name)}function Wi(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 Rt(e){return ve.get(e)??e}function Yi(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 Re(e){return ve.get(e)}function pe(e=[]){let t=new Map,n=new Map(ve);for(let r of hn.values())t.set(r.canonical,{name:r.name,kind:r.kind,canonical:r.canonical,aliases:new Set([r.name,r.canonical,...r.aliases]),compatibleWith:new Set(r.compatibleWith),validate:r.validate,source:r.source});for(let r of e)for(let[i,o]of Object.entries(r.types??{})){let s=Rt(o.canonical??i),d=t.get(s)??Wi(i,s,o);d.name=i,d.kind=o.kind,d.canonical=s,d.source="augmentation",d.validate=o.validate??d.validate,d.aliases.add(i),d.aliases.add(s);for(let u of o.aliases??[])d.aliases.add(u);for(let u of o.compatibleWith??[])d.compatibleWith.add(u);t.set(s,d),n.set(i,s),n.set(s,s);for(let u of o.aliases??[])n.set(u,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(i=>n.get(i)??Rt(i))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,i])=>[r,Yi(i)])),namesToCanonical:n}}function U(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Rt(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ke(e,t){return U(e,t)?.canonical}function xe(e,t,n){let r=U(e,t),i=U(e,n);return!r||!i?!1:r.kind==="any"||i.kind==="any"||r.canonical===i.canonical?!0:r.compatibleWith.includes(i.canonical)||i.compatibleWith.includes(r.canonical)}function Tn(e,t){if(e.length<3)return!1;let n=0,r=e.length-1;for(;n<=r&&e[n]===" ";)n+=1;for(;n<=r&&e[r]===" ";)r-=1;let o=r-n+1>=3&&e[n]==="{"&&e[r]==="}";return o&&t&&(t.current=e.slice(n+1,r)),o}function vn(e){let t={};return Tn(e,t)?t.current:void 0}function z(e,t){return t==="{=}"||t==="="?e:vn(t)}var Rn=[{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:[]}],xn={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 kn=[{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:[]}],Dn={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 En=[{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:[]}],Nn={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 Cn=["4.6.2","4.8.2","4.9.0"],xt="4.9.0",ke={"4.6.2":{models:Rn,genericSubTreeModel:xn},"4.8.2":{models:kn,genericSubTreeModel:Dn},"4.9.0":{models:En,genericSubTreeModel:Nn}};var In=Cn.map(e=>`btcpp-v${e}`),De=["btcpp-v4",...In],Bn=`btcpp-v${xt}`;function Mn(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 Hi(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Mn)}))}function _n(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Mn)}}function Zi(){let e={};for(let[t,n]of Object.entries(ke))e[`btcpp-v${t}`]=Hi(n.models);return e}function Ji(){let e={};for(let[t,n]of Object.entries(ke))e[`btcpp-v${t}`]=_n(n.genericSubTreeModel);return e}var Qi=Zi(),eo=Ji();function to(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(ke,t)}function wn(e){return e==="btcpp-v4"?Bn:e}function no(e){return e==="btcpp-v4"?xt:e.replace(/^btcpp-v/,"")}function Pn(e){if(e&&e!=="btcpp-v4"&&!to(e))throw new Error(`unsupported builtin model set: ${e}`)}function kt(e="btcpp-v4"){Pn(e);let t=wn(e);return Qi[t].map(r=>An(r))}function Dt(e="btcpp-v4"){Pn(e);let t=eo[wn(e)]??_n(ke[no(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function An(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 Ee(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let r=t.name.localeCompare(n.name);if(r!==0)return r;let i=t.direction.localeCompare(n.direction);if(i!==0)return i;let o=(t.type??"").localeCompare(n.type??"");if(o!==0)return o;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function Ge(e,t){let n=Ee(e),r=Ee(t);return JSON.stringify(n)===JSON.stringify(r)}function Et(e,t){if(Ge(e,t))return"none";let n=Ee(e),r=Ee(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let i=new Map(r.ports.map(a=>[a.name,a])),o=!1,s=!1;for(let a of n.ports){let d=i.get(a.name);if(!d){s=!0;continue}(a.direction!==d.direction||a.type!==d.type||a.required!==d.required)&&(s=!0);let u=a.enum?JSON.stringify(a.enum):"",l=d.enum?JSON.stringify(d.enum):"";u!==l&&(s=!0),a.description!==d.description&&(s=!0),a.defaultValue!==d.defaultValue&&(o=!0)}return s?"ports":o?"port-default":"mixed"}import{z as M}from"zod";var Ln=M.object({direction:M.enum(["input","output","inout"]).optional(),type:M.string().optional(),required:M.boolean().optional(),default:M.string().optional(),description:M.string().optional(),enum:M.array(M.string()).optional()}).strict(),We=M.object({kind:M.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:M.record(M.string(),Ln).optional(),description:M.string().optional()}).strict(),ro=M.object({nodes:M.record(M.string(),We)}).strict();import{z as S}from"zod";var Un=S.enum(["off","info","warn","error"]),Vn=S.union([Un,S.tuple([Un,S.record(S.string(),S.unknown())])]),io=S.object({include:S.array(S.string()).optional(),ignore:S.array(S.string()).optional(),useGitignore:S.boolean().optional(),followSymlinks:S.boolean().optional(),maxSize:S.number().int().positive().optional()}).strict(),oo=S.string(),so=S.object({name:S.string(),attribute:S.string(),base:S.enum(["file","project-root"]).optional()}).strict(),ao=S.object({elements:S.array(so).optional(),variables:S.record(S.string(),S.string()).optional(),allowOutsideRoot:S.boolean().optional(),maxDepth:S.number().int().min(1).optional(),maxFiles:S.number().int().min(1).optional()}).strict(),lo=S.object({entrypoints:S.array(oo).optional(),includes:ao.optional(),behaviorTreeIds:S.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),uo=S.object({builtins:S.array(S.enum(De)).optional(),files:S.array(S.string()).optional(),augmentations:S.array(S.string()).optional(),definitions:S.array(S.string()).optional(),inline:S.record(S.string(),We).optional()}).strict(),On=S.object({inline:S.enum(["allow","deny"]).optional()}).strict(),co=S.object({enabled:S.boolean().optional(),rules:S.record(S.string(),Vn).optional(),baseline:S.string().optional(),suppressions:On.optional()}).strict(),po=S.object({rules:S.record(S.string(),Vn).optional(),suppressions:On.optional()}).strict(),qn=S.object({indentWidth:S.number().int().min(1).max(8).optional(),xmlDeclaration:S.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:S.boolean().optional(),lineEnding:S.enum(["lf","crlf","auto"]).optional()}).strict(),mo=S.object({files:S.array(S.string()),linter:po.optional(),formatter:qn.optional()}).strict(),Fn=S.object({$schema:S.string().optional(),strict:S.boolean().optional(),files:io.optional(),resolver:lo.optional(),models:uo.optional(),linter:co.optional(),formatter:qn.optional(),overrides:S.array(mo).optional()}).strict();function $n(e){return e.flatMap(fo)}function fo(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let o=Xn([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:o,message:`unknown config field \`${o}\``}});let n=Xn(e.path);return zn(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 Xn(e){return e.map(String).join(".")||void 0}function zn(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(jn);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(i=>i.issues??[]).some(jn):!1}function jn(e){return typeof e=="object"&&e!==null&&zn(e)}function Ne(e){let t=Fn.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:$n(t.error.issues)}}function go(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 yo(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 So(e){return e.map(t=>P(t.code,t.severity==="error"?b.Error:b.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function bo(e){let t=[],n=St(),{$schema:r,strict:i,overrides:o,...s}=e;i&&(n=Te(n,pn)),n=Te(n,s),n.overrides=(o??[]).map(d=>({files:d.files,linter:yo(d.linter),formatter:go(d.formatter)}));let a=!t.some(d=>d.severity===b.Error);return{config:n,diagnostics:t,ok:a}}function Nt(e){let t=Ne(e);return t.ok?bo(t.value):{ok:!1,config:St(),diagnostics:So(t.diagnostics)}}var ho="https://unpkg.com/@abco20/btxml-checker/schemas/btxml.config.schema.json";function Ct(){return{$schema:ho}}function To(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 vo(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),i=r?t.slice(1):t,s=To(i).test(n);return r?!s:s}function Kn(e,t){return e.overrides.filter(n=>n.files.some(r=>vo(t,r)))}function Ye(e){return e.replaceAll("\\","/")}function Ro(e){try{return decodeURIComponent(e)}catch{return e}}function Gn(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Ro(t.pathname);return/^\/[A-Za-z]:/.test(n)?Ye(n.slice(1)):t.host?Ye(`//${t.host}${n}`):Ye(n)}function He(e,t){let n=Ye(t),r=Kn(e,n),i=e;for(let o of r)i=Te(i,{linter:o.linter,formatter:o.formatter});return{files:i.files,resolver:i.resolver,models:i.models,linter:i.linter,formatter:i.formatter}}function It(e,t){return He(e,Gn(t))}function me(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 Ze(e){if(typeof e=="string")return ze.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&ze.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let r={severity:t};return n!==void 0&&(r.options=n),r}}return null}function Wn(e,t){if(t)return Ke(e,t)}function Yn(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Hn(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return P(e.code,b.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function xo(e,t,n,r,i){let o=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:o,typeSource:n.typeSource??Yn(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},d=r.typeRefinement;if(!d)return{...a,type:a.effectiveType};let u=Wn(e,d.from),l=Wn(e,o);return u&&u!==l?(i.push(Hn({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${o??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:o,actualFrom:d.from,to:d.to},notes:o||d.from?[`base type: ${o??"(unspecified)"}`,`requested from: ${d.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:d.to,effectiveType:d.to,typeSource:"model-augmentation",typeRefinement:d}}function ko(e,t,n,r){let i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of Object.entries(n.ports??{})){let a=i.get(o);if(!a){r.push(Hn({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${o}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:o}}));continue}i.set(o,xo(e,t,a,s,r))}return{...t,ports:t.ports.map(o=>i.get(o.name)??o)}}function Do(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Yn(e)}}function Zn(e,t,n){let r=[],i=new Map([...e.entries()].map(([o,s])=>[o,{...s,ports:s.ports.map(Do)}]));for(let o of n)for(let[s,a]of Object.entries(o.augment??{})){let d=i.get(s);if(!d){r.push(P("BT117_AUGMENT_TARGET_NOT_FOUND",b.Error,`augmentation target node \`${s}\` not found`,void 0,o.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:o.path?[`augmentation file: ${o.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:o.path}));continue}i.set(s,ko(t,d,a,r))}return{modelsById:i,diagnostics:r}}function er(e){return Ce("builtin",0,!1,e)}function tr(e){return Ce("xml-tree-nodes-model",10,!0,e)}function nr(e){return Ce("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function rr(e){return Ce("node-definition-file",20,!0,e)}function ir(e){return Ce("config-inline",30,!0,e)}function Ce(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(i=>or(i,e,n&&i.editable!==!1))}}function Eo(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function or(e,t,n){let r=Eo(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:r}))}}function fe(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 Jn(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 No(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let r=new Map(e.ports.map(o=>[o.name,o])),i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of r)i.has(o)||n.push({kind:"port-removed",portName:o,sourceIndex:0,port:Jn(s)});for(let[o,s]of i)r.has(o)||n.push({kind:"port-added",portName:o,sourceIndex:1,port:Jn(s)});for(let[o,s]of r){let a=i.get(o);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:o,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:o,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:o,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:o,left:s.defaultValue,right:a.defaultValue});let d=s.enum?JSON.stringify([...s.enum].sort()):"",u=a.enum?JSON.stringify([...a.enum].sort()):"";d!==u&&n.push({kind:"port-enum",portName:o,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:o,left:s.description,right:a.description})}return n}function Qn(e,t){let n=new Map;for(let r of e){let i=n.get(r.id);if(!i){n.set(r.id,r);continue}if(Ge(i,r))continue;let o=Et(i,r),s=No(i,r),a;if(o==="port-default"){let d=new Map(i.ports.map(p=>[p.name,p])),u=r.ports.find(p=>{let g=d.get(p.name);return g&&g.defaultValue!==p.defaultValue}),l=u?.name??"unknown",m=[fe(i,0),fe(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:l,sources:[{source:fe(i,0),value:d.get(l)?.defaultValue},{source:fe(r,1),value:u?.defaultValue}]},t.push({id:r.id,definitions:[i,r],sources:m,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${l}\` on node \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${r.id}\` definition or remove the duplicate model`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}else{let d=[fe(i,0),fe(r,1)];a={kind:"node-model-conflict",nodeId:r.id,sources:d,differences:s},t.push({id:r.id,definitions:[i,r],sources:d,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${r.id}\` model definitions agree, or keep only one definition at the same precedence level`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}}return n}function Co(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(r=>[r.name,r]));for(let r of t.ports)n.set(r.name,r);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function sr(e){let t=[],n=new Map,r=new Map,i=[...e].sort((a,d)=>a.precedence-d.precedence),o=new Map,s=new Map;for(let a of i){let d=o.get(a.precedence)??[],u=a.models.map(l=>or(l,a.kind,a.editable&&l.editable!==!1));d.push(...u),o.set(a.precedence,d);for(let l of u)s.set(l.id,a.precedence)}for(let[a,d]of[...o.entries()].sort((u,l)=>u[0]-l[0])){let u=d.filter(g=>s.get(g.id)===a),l=d.filter(g=>s.get(g.id)!==a),m=Qn(l,[]);for(let[g,x]of Qn(u,t))m.set(g,x);let p=new Set(d.map(g=>g.id));for(let g of p)s.get(g)===a&&n.set(g,d.filter(x=>x.id===g));for(let[g,x]of m)r.set(g,Co(r.get(g),x))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Io(e){return De.includes(e)}function Bo(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:pe(),augmentations:[]}}function Mo(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function _o(e,t,n){for(let r of new Set(n))if(Io(r)){for(let i of kt(r))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...Dt(r))}}function wo(e,t,n,r,i){for(let o of i){let s=bt(o,{uri:o.uri,path:o.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(o.uri,a);for(let d of a.behaviorTrees)Mo(e.behaviorTreesById,d.id,d);o.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Po(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 Ao(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let i=Po(r);t.has(i)||(t.add(i),n.push(r))}e.genericSubTreePorts=n}function Lo(e,t,n,r,i){e.modelLayers.push(er(t),tr(n),nr(r)),i.models?.length&&e.modelLayers.push(rr([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function Ie(e,t){return Uo(e,t)}function Uo(e,t){let n=Bo(),r=[],i=[],o=[],s=[];_o(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=pe(t.augmentations??[]),wo(n,r,o,s,e),Ao(n),Lo(n,i,o,s,t);let a=t.config.models.inline;if(a){let l=[];for(let[m,p]of Object.entries(a))l.push(vt(m,p));n.modelLayers.push(ir(l))}let d=sr(n.modelLayers),u=Zn(d.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=d.nodeModelsById,n.mergedNodeModelsById=u.modelsById,n.modelConflicts=d.conflicts,r.push(...u.diagnostics),{ok:r.every(l=>l.severity!==b.Error),index:n,diagnostics:r}}var ar={unknownSubTreePorts:"allow"};function dr(e){return{...ar,...e}}var Vo=["Action","Condition","Control","Decorator"],Oo=new Set(Vo);var qo=new Set(["input_port","output_port","inout_port"]);function Mt(e){return Oo.has(e)}function Je(e,t){return e.attributes.find(n=>n.name===t)?.value}function Bt(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&Bt(n,t))return!0;return!1}function lr(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return Bt(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&Bt(n,t))return!0;return!1}function Qe(e){return qo.has(e.name)}function ur(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":Mt(e.name)?"generic-node":Qe(e)?"unknown-xml":"concrete-node"}function _t(e){if(e.name==="SubTree")return Je(e,"ID")||"SubTree";if(Mt(e.name))return Je(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||Qe(e)))return e.name}function V(e){return e.typeRegistry}function K(e,t){return U(V(e),t)}function ge(e,t,n){return xe(V(e),t,n)}function Be(e,t){return e.documents.get(t)}function te(e,t){return e.behaviorTreesById.get(t)??[]}function wt(e,t){return e.behaviorTreesById.has(t)}function Pt(e){return[...e.behaviorTreesById.keys()]}function At(e,t){return e.documents.has(t)}function Y(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Lt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Ut(e){return[...e.genericSubTreePorts]}function Vt(e){return[...e.augmentations]}function Me(e){return e.modelConflicts}function _e(e,t){let{id:n,fileLocalUri:r,config:i}=t,o=te(e,n);if(o.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let u=o.filter(l=>l.uri===r);u.length>0&&(o=u)}let a=Y(e,n),d=a?.kind==="SubTree"?[a]:[];return o.length===1?{status:"resolved",kind:"behavior-tree",treeId:o[0].id,behaviorTree:o[0]}:{status:"ambiguous",candidates:[...o.map(u=>u.id),...d.map(u=>u.id)],behaviorTrees:o,definitions:d}}let s=Y(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Ot(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Y(e,t);if(n){let i=Me(e).find(o=>o.id===t&&o.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let r=Lt(e,t);return r.length===1?{status:"resolved",model:r[0]}:r.length>1?{status:"ambiguous",nodeType:t,candidates:r}:{status:"unresolved",nodeType:t}}function qt(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Ft(e){let t=Ut(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return qt([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Xt(e){let{attribute:t}=e,n=e.ports.find(r=>r.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:ht(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 H(e,t){let n=dr(t.policy),r=t.element,i=ur(r),o=lr(t.documentRoot,r);if((t.isModelDefinition||o&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),o&&Qe(r)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:r,tagName:r.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=_t(r);if(i!=="subtree"){let g=Ot(e,s),x=Ft({index:e,tagForm:i,model:g}),T=r.attributes.map(N=>Xt({attribute:N,ports:x,allowsArbitraryAttributes:!1,model:g}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:g,ports:x,allowsArbitraryAttributes:!1,portUsages:T}}let a=Je(r,"ID"),d=a?_e(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},u={status:"unresolved",nodeType:a},l=!1;if(d.status==="resolved"&&d.kind==="node-model")u={status:"resolved",model:d.model};else if(d.status==="resolved"&&d.kind==="behavior-tree"){let g=Ot(e,d.treeId);g.status==="resolved"&&g.model.kind==="SubTree"?u=g:l=n.unknownSubTreePorts==="allow"}else d.status==="ambiguous"&&d.definitions.length>0?u=d.definitions.length===1?{status:"resolved",model:d.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:d.definitions}:l=n.unknownSubTreePorts==="allow";let m=Ft({index:e,tagForm:i,model:u,subtreeModelPorts:d.status==="ambiguous"?qt(d.definitions.flatMap(g=>g.ports)):void 0}),p=r.attributes.map(g=>Xt({attribute:g,ports:m,allowsArbitraryAttributes:l,model:u,unknownModelPortStatus:!l&&u.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:u,subtree:{id:a,target:d},ports:m,allowsArbitraryAttributes:l,portUsages:p}}function et(e,t){return H(e,t).portUsages.find(r=>r.name===t.attributeName)}function jo(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function $o(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function cr(e,t){let n=e.line,r=e.character,i=e.offset;for(let o of t){if(i+=o.length,o===`
10
+ `){n+=1,r=0;continue}r+=o.length}return{line:n,character:r,offset:i}}function zo(e,t,n){let r=cr(e,t),i=cr(r,n);return{start:r,end:i}}function Ko(e,t){let n=t.valueContentRange||t.valueRange,r=e.originalText.slice(n.start.offset,n.end.offset),i=[];for(let o of r.matchAll(/\{([^}]+)\}/g)){let s=o[0],a=o[1],d=o.index??0;i.push({raw:s,key:a,range:zo(n.start,r.slice(0,d),s),syntax:"braced"})}return i.length===0&&(r.includes("{")||r.includes("}"))&&i.push({raw:r,key:r,range:n,syntax:"invalid"}),i}function Go(e,t){return jo(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function mr(e){let t=[];for(let n of e)t.push(n),t.push(...mr(n.children));return t}function Wo(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 Yo(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 pr(e,t){return e.attributes.find(n=>n.name===t)}function Ho(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let i of r.children)i.kind==="element"&&n(i)};if(e.name==="TreeNodesModel")return n(e),t;for(let r of e.children)r.kind!=="element"||r.name!=="TreeNodesModel"||n(r);return t}function tt(e,t){let n=t.semantic,r=Ho(e.root),i=$o(e).map(d=>({id:pr(d,"ID")?.value,element:d,rootNode:void 0,nodes:[]})),o=[],s=[],a=(d,u,l,m)=>{let p=H(n,{element:d,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(d)}),g=Wo(p),x={element:d,path:m,tagName:d.name,kind:Go(d,p),model:g,usage:p,portBindings:[],children:[],parent:l,behaviorTree:u};if(x.portBindings=p.portUsages.filter(T=>T.status!=="reserved-attribute").map(T=>({name:T.name,value:T.value,attribute:T.attribute,declaredPort:Yo(T),usage:T,blackboardReferences:Ko(e,T.attribute)})),x.children=d.children.filter(T=>T.kind==="element").map((T,N)=>a(T,u,x,[...m,N])),d.name==="SubTree"){let T=pr(d,"ID")?.value;o.push({node:x,id:T,target:p.subtree?.target??{status:"unresolved",id:T},portRemaps:x.portBindings})}return x};for(let d of i){let u=d.element.children.filter(l=>l.kind==="element").map((l,m)=>a(l,d,void 0,[m]));d.rootNode=u[0],d.nodes=mr(u),s.push(...d.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:o,nodes:s}}function fr(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function gr(e,t){return e.includeIssuesByUri.get(t)??[]}function yr(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Sr(e){let{document:t,semantic:n,config:r,view:i}=e,o=new Map(i.nodes.map(u=>[u.element,u])),s=new Map(i.subtreeCalls.map(u=>[u.node.element,u])),a=me(r),d=Jo(t.root);return{document:t,view:i,semantic:n,config:r,options:e.options,facts:e.facts,report(u){let l=P(u.code??e.code,e.severity,u.message,u.range,t.uri,u.details,u.data);e.diagnostics.push({...l,rule:e.rule,...u.relatedInformation?{relatedInformation:u.relatedInformation}:{}})},getIncludeIssues(u){let l=gr(e.facts,t.uri);return u?l.filter(m=>m.kind===u):l},getSuppressionIssues(u){let l=yr(e.facts,t.uri);return u?l.filter(m=>m.kind===u):l},getNodeUsage(u){return H(n,{element:u,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:d.has(u)})},getPortUsage(u,l){return et(n,{element:u,documentRoot:t.root,attributeName:l,uri:t.uri,config:r,policy:a,isModelDefinition:d.has(u)})},resolveSubTree(u,l){return _e(n,{id:u,fileLocalUri:l,config:r})},getNodeModel(u){return Y(n,u)},getBehaviorTrees(u){return te(n,u)},getTreeNodeView(u){return o.get(u)},getSubTreeCallView(u){return s.get(u)}}}function Jo(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return jt(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||jt(n,t);return t}function jt(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&jt(n,t)}function R(e){let t=cn[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Qo={"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 Z(e){return R({name:Qo[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:es(n)})}}}})}function es(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 br=[Z("missing-path"),Z("not-found"),Z("cycle"),Z("outside-root"),Z("unresolved-variable"),Z("depth-exceeded"),Z("too-many-files"),Z("external-used")];import ts from"ajv";var ns=ts,rs=new ns,is=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],os={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}},$t=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"]),hr=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 Tr(e){return e.children.filter(t=>t.kind==="element")}function O(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function vr(e){return e.children.some(t=>t.kind==="element")}function rt(e,t){let n=Rr(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Rr(e){let t=z(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 nt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return us(e.registry,n,e.value)?void 0:nt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!kr(r,e.value))return ss(r)?nt(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${r}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${r}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function ye(e){return e.effectiveType??e.type}function xr(e,t){return U(e,ye(t))}function zt(e,t){return z(e,t)}function nt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function ss(e){let t=Re(e)??e;return Dr(e)!==void 0||cs.has(t.toLowerCase())}function kr(e,t){let n=Dr(e);if(n)return as(n,t);let r=(Re(e)??e).toLowerCase();switch(r){case"std::string":case"string":case"bt::any":case"bt::anytypeallowed":case"bt::anytype":case"any":return!0;case"bool":return t==="0"||t==="1"||t==="true"||t==="TRUE"||t==="True"||t==="false"||t==="FALSE"||t==="False";case"float":case"double":return/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/.test(t);case"bt::nodestatus":case"nodestatus":return is.includes(t);default:return $t.has(r)||hr.has(r)?Er(r,t):!1}}function Dr(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function as(e,t){let n=ls(t);return n?n.every(r=>ds(e,r)):!1}function ds(e,t){if(t.kind==="string")return kr(e,t.value);let n=(Re(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 $t.has(n)||hr.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Er(n,String(t.value)):!1}}function Er(e,t){let n=os[e];if(!n)return!1;if($t.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let r=BigInt(t);return r>=n.min&&r<=n.max}catch{return!1}}function ls(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 us(e,t,n){switch(t.kind){case"pattern":return new RegExp(`^(?:${t.pattern})$`).test(n);case"enum":return t.values.includes(n);case"tuple":{let r=n.split(t.separator);return r.length!==t.items.length?!1:r.every((i,o)=>{let s=t.items[o];return s?Rr({port:{name:`tuple[${o}]`,type:s},value:i,registry:e,typeDefinition:U(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${o}]`})===void 0:!1})}case"json-schema":try{let r=JSON.parse(n);return rs.compile(t.schema)(r)===!0}catch{return!1}}}var cs=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 Nr=[R({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})}}}}),R({name:"model/no-duplicate-port-name",meta:{description:"Ports with the same name are not allowed."},create(e){return{TreeNodeModel(t){let n=new Set;for(let r of t.ports)r.name&&(n.has(r.name)&&e.report({message:`Duplicate port name "${r.name}" in ${t.id}`,range:r.nameRange||r.range||t.idRange||t.range}),n.add(r.name))}}}}),R({name:"model/valid-port-name",meta:{description:"Port names must be valid XML attribute names for BT nodes."},create(e){return{TreeNodeModel(t){for(let n of t.ports){if(!n.name)continue;let r=Tt(n.name);r&&e.report({code:y.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),R({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of Me(e.semantic))t.uri&&t.uri!==e.document.uri||ps(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),R({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!ms(t))return;let n=t.attributes.find(d=>d.name==="default")??t.attributes.find(d=>d.name==="default_value");if(!n)return;let r=t.attributes.find(d=>d.name==="name")?.value;if(!r)return;let o=fs(e.document.root,t)?.attributes.find(d=>d.name==="ID")?.value;if(!o)return;let a=e.getNodeModel(o)?.ports.find(d=>d.name===r);if(a){if(a.direction==="output"){z(a.name,n.value)===void 0&&e.report({code:y.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}rt(e,{port:a,value:n.value,range:n.range,registry:V(e.semantic),typeDefinition:K(e.semantic,a.type),allowRemap:!0,diagnosticCode:y.InvalidPortDefaultValue,customLiteralDiagnosticCode:y.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),R({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=V(e.semantic),n=new Map,r=e.options.allowStringEntryCompatibility??!0;for(let i of e.view.nodes)for(let o of i.portBindings){if(o.declaredPort.status!=="resolved")continue;let s=zt(o.name,o.value);if(!s)continue;let a=xr(t,o.declaredPort.port);if(!a||a.kind==="any")continue;let d=n.get(s)??[];d.push({key:s,nodeId:Ss(i.element),port:o.declaredPort.port,typeDefinition:a,range:o.attribute.range}),n.set(s,d)}for(let[i,o]of n){let s=gs(e.semantic,o,r);if(s.length<2)continue;let a=o.find(d=>d.typeDefinition.canonical===s[0]);e.report({code:y.BlackboardTypeMismatch,message:`blackboard entry \`${i}\` is used with incompatible port types: ${s.map(d=>`\`${d}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${i}\` mixes incompatible port types`,notes:o.filter(d=>s.includes(d.typeDefinition.canonical)).map(d=>`${d.nodeId}.${d.port.name} declares ${ys(d.port,d.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),R({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(bs(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&i.port.direction==="output"&&zt(i.port.name,r.value)===void 0&&e.report({code:y.OutputPortRequiresRemap,message:`output port \`${i.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${i.port.name}\` requires a blackboard remap`,help:`use \`${i.port.name}="{${i.port.name}}"\` or \`${i.port.name}="{some_key}"\``}})}}}}})];function ps(e,t){return e.diagnostics.some(n=>n.code===y.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function ms(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function fs(e,t){if(!e)return;return n(e,!1,void 0);function n(r,i,o){let s=i||r.name==="TreeNodesModel",a=s&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:o;if(r===t)return a;for(let d of r.children){if(d.kind!=="element")continue;let u=n(d,s,a);if(u)return u}}}function gs(e,t,n){let r=new Set;for(let i=0;i<t.length;i+=1){let o=t[i];if(o)for(let s=i+1;s<t.length;s+=1){let a=t[s];a&&(n&&(o.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||ge(e,o.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(o.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function ys(e,t){return ye(e)??t.canonical}function Ss(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function bs(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var hs=new Set(["_failureIf","_successIf","_skipIf","_while"]),Ts=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Kt(e){if(hs.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Ts.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}var Cr=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Ir=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function Br(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Mr(r)){n++;continue}if(Gt(r)){let a=n;for(n++;n<e.length&&xs(e[n]);)n++;let d=e.slice(a,n);t.push({type:d==="true"||d==="false"?"Boolean":"Identifier",text:d,start:a,end:n});continue}if(ne(r)){let a=Rs(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=vs(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),o=Cr.get(i);if(o){t.push({type:o,text:i,start:n,end:n+2}),n+=2;continue}let s=Ir.get(r);if(s){t.push({type:s,text:r,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:r,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function vs(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 Rs(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&&ks(e[n]);)n++;return i===n||Es(e,n)?(n=we(e,n),Pe(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&ne(e[n]);)n++;let r="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:r,text:e.slice(t,n),start:t,end:n};if(!ne(e[n+1]))return n=we(e,n+1),Pe(e,t,n);for(r="Real",n+=1;n<e.length&&ne(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let o=n;for(;n<e.length&&ne(e[n]);)n++;if(o===n)return n=we(e,Math.max(n,i+1)),Pe(e,t,n);r="Real"}return Ds(e,n)?(n=we(e,n),Pe(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function we(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Mr(r)||Ir.has(r)||Cr.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Pe(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Mr(e){return e===" "||e===" "||e===`
11
+ `||e==="\r"}function Gt(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function xs(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function ne(e){return e!==void 0&&/[0-9]/.test(e)}function ks(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Ds(e,t){let n=e[t];return Gt(n)||ne(n)}function Es(e,t){let n=e[t];return n==="."||Gt(n)||ne(n)}var Ns=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Cs=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),_r=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),L={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Le(e){let t=Br(e),n=t.filter(r=>r.type==="Error");return n.length>0?{ok:!1,errors:n.map(r=>({kind:"invalid-token",message:`invalid token \`${r.text}\``,range:{start:r.start,end:r.end}})),tokens:t}:wr(t,e)}function wr(e,t=""){let n=new Wt(e,t),r=[];if(n.peek().type==="EndOfInput")return{ok:!1,errors:[{kind:"empty-script",message:"empty script",range:{start:0,end:0}}],tokens:e};for(;n.peek().type!=="EndOfInput";){let o=n.parseExpression(0);if(!o)return{ok:!1,errors:n.errors,tokens:e};for(r.push(o);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let i=ws(r);return{ok:!0,program:{kind:"Program",statements:r,range:i},tokens:e}}var Wt=class{constructor(t,n,r=0){this.tokens=t;this.source=n;this.index=r}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let r=this.peek();if(r.type==="EndOfInput"||r.type==="Semicolon"||r.type==="RightParen"||r.type==="Colon")break;let i=Ns.get(r.type);if(i){if(t>=L.assignment)break;this.consume();let d=this.parseExpression(0);if(!d)return;n={kind:"AssignmentExpression",operator:i,left:n,right:d,range:Ae(n.range,d.range)};break}if(r.type==="Question"){if(t>=L.ternary)break;this.consume();let d=this.parseExpression(0);if(!d)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let u=this.parseExpression(L.ternary);if(!u)return;n={kind:"ConditionalExpression",condition:n,thenExpression:d,elseExpression:u,range:Ae(n.range,u.range)};break}let o=_r.get(r.type);if(o){if(t>=L.comparison)break;this.consume();let d=[n],u=[o],l=this.parseExpression(L.comparison);if(!l)return;for(d.push(l);;){let m=_r.get(this.peek().type);if(!m)break;this.consume();let p=this.parseExpression(L.comparison);if(!p)return;u.push(m),d.push(p)}n={kind:"ComparisonChain",operands:d,operators:u,range:Ae(d[0].range,d[d.length-1].range)};continue}let s=Cs.get(r.type),a=s?Ms(r.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let d=this.parseExpression(a);if(!d)return;n={kind:"BinaryExpression",operator:s,left:n,right:d,range:Ae(n.range,d.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${r.text||r.type}\``,r);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:re(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),Is(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Bs(t.type),argument:n,range:Ae(re(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),r=this.parseExpression(0);if(!r)return;let i=this.peek();if(i.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",i);return}return this.consume(),_s(r,{start:n.start,end:i.end})}default:this.reportError("expected-operand","expected operand",t);return}}peek(){return this.tokens[this.index]??this.tokens[this.tokens.length-1]}consume(){let t=this.peek();return this.index+=1,t}match(t){return this.peek().type!==t?!1:(this.consume(),!0)}reportError(t,n,r){this.errors.push({kind:t,message:n,range:re(r)})}};function Is(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:re(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:re(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:re(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:re(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Bs(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Ms(e){switch(e){case"PipePipe":return L.pipePipe;case"AmpAmp":return L.ampAmp;case"Pipe":case"Caret":return L.pipeCaret;case"Ampersand":return L.ampersand;case"Plus":case"Minus":case"DotDot":return L.additive;case"Star":case"Slash":return L.multiplicative;default:return}}function re(e){return{start:e.start,end:e.end}}function Ae(e,t){return{start:e.start,end:t.end}}function _s(e,t){return{...e,range:t}}function ws(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Ps=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 Yt(e={}){let t=pe(e.augmentations??[]),n=e.areTypesCompatible??((o,s)=>xe(t,o,s)),r=new Map,i={symbols:new Map,enums:As(e.enums,e.augmentations??[])};for(let o of e.symbols??[])Ls(i,r,o,n);return i}function ie(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function Ht(e){let t=ie(e.baseEnvironment),n=[];for(let r of e.entries){let i=ie(t),o=r.parseResult??Le(r.source),s=ie(i),a;o.ok&&(a=Ue({program:o.program,environment:i,attributeName:r.attributeName,originId:r.originId??String(r.id)}),s=ie(a.environment)),n.push({id:r.id,parseResult:o,environmentBefore:i,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.enums.clear();for(let[d,u]of s.symbols)t.symbols.set(d,{...u});for(let[d,u]of s.enums)t.enums.set(d,u)}return n}function Pr(e){let t=new Map;for(let n of e)for(let[r,i]of Object.entries(n.script?.enums??{}))t.set(r,i);return t}function it(e,t){let n=U(e,t);return Ar(t,n)}function Ar(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"}:Ps.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function Lr(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 ot(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 oe(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Zt(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 As(e,t){if(e instanceof Map)return new Map(e);let n=Pr(t??[]);for(let[r,i]of Object.entries(e??{}))n.set(r,i);return n}function Ls(e,t,n,r){let i=e.symbols.get(n.name);if(!i){e.symbols.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let o=t.get(n.name),s=i.conflict===!0||o!==void 0&&n.compatibilityKey!==void 0&&!r(o,n.compatibilityKey)||!Lr(i.type,n.type);e.symbols.set(n.name,{...i,readable:i.readable||n.readable,writable:i.writable||n.writable,conflict:s}),o===void 0&&t.set(n.name,n.compatibilityKey)}var se={kind:"number"},at={kind:"string"},st={kind:"bool"},G={kind:"unknown"},_={kind:"error"};function Ue(e){let t=ie(e.environment),n=[],r=[],i=[],o=[],s=[],a=[];return e.program.statements.forEach((d,u)=>{a.push(j({expression:d,statementIndex:u,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,statementTypes:a,finalType:a.at(-1)}}function j(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?se:t.valueKind==="string"?at:t.valueKind==="boolean"?st:G;case"Identifier":return Vs(e,t.name,t.range);case"UnaryExpression":{let n=j({...e,expression:t.argument});return t.operator==="!"?oe(n)?st:(q(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"),_):n.kind==="number"?se:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?_:G:(q(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"),_)}case"BinaryExpression":{let n=j({...e,expression:t.left}),r=j({...e,expression:t.right});switch(t.operator){case"&&":case"||":return Ur(n)||Ur(r)?(q(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"),_):st;case"+":return n.kind==="string"&&r.kind==="string"?at:n.kind==="number"&&r.kind==="number"?se:Jt(n,r)?G:(Qt(e,t.range,t.operator),_);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?se:Jt(n,r)?G:(Qt(e,t.range,t.operator),_);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?at:Jt(n,r)?G:(Qt(e,t.range,t.operator),_)}return G}case"ComparisonChain":{let n=t.operands.map(r=>j({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let i=t.operators[r],o=n[r],s=n[r+1];if(!qs(i,o,s))return q(e,"invalid-operand-type",{start:t.operands[r]?.range.start??t.range.start,end:t.operands[r+1]?.range.end??t.range.end},`operator \`${i}\` cannot compare these operand types`,`comparison operands for \`${i}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),_}return st}case"ConditionalExpression":{let n=j({...e,expression:t.condition});oe(n)||q(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let r=j({...e,expression:t.thenExpression}),i=j({...e,expression:t.elseExpression}),o=Zt(r,i);return o||(q(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"),_)}case"AssignmentExpression":return Us(e)}}function Us(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:i}=e,o=e.expression,s=j({...e,expression:o.right});if(o.left.kind!=="Identifier")return j({...e,expression:o.left}),q(e,"invalid-operand-type",o.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),_;let a=o.left,d=o.operator===":="?"declare":o.operator==="="?"write":"readwrite",u={name:a.name,kind:d,range:a.range,identifier:a,statementIndex:e.statementIndex};r.push(u);let l=t.symbols.get(a.name);if(o.operator===":="&&!l){let p={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,p),e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:p}}),i.push(p),s}if(!l)return e.resolvedIdentifiers.push({access:u,resolution:{kind:"unknown"}}),q(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"),_;if(e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:l}}),o.operator==="=")return ot(l.type,s)?(en(l,s),s):(Vr(e,a,l.type,s),_);if(o.operator===":=")return ot(l.type,s)?(en(l,s),s):(Vr(e,a,l.type,s),_);let m=Os(l.type,s,o.operator);return m?(en(l,m),m):(q(e,"invalid-compound-assignment",o.range,`operator \`${o.operator}\` is not valid for these operand types`,`compound assignment \`${o.operator}\` is not allowed here`,o.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),_)}function Vs(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),se;let o=e.environment.symbols.get(t);return o?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:o}}),o.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),G)}function Os(e,t,n){return e.kind==="error"||t.kind==="error"?_:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?G:n==="+="?e.kind==="number"&&t.kind==="number"?se:e.kind==="string"&&t.kind==="string"?at:void 0:e.kind==="number"&&t.kind==="number"?se:void 0}function Jt(e,t){return dt(e)||dt(t)}function dt(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Ur(e){return!oe(e)}function qs(e,t,n){return dt(t)||dt(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 Qt(e,t,n){q(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 Vr(e,t,n,r){q(e,"variable-type-mismatch",t.range,`cannot assign ${tn(r)} to variable \`${t.name}\` of type ${tn(n)}`,`\`${t.name}\` expects ${tn(n)} here`,"assign a compatible value or change the variable's source type")}function en(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 q(e,t,n,r,i,o){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:i,help:o}})}function tn(e){return e.kind==="custom"?e.name:e.kind}var Or=new WeakMap;function lt(e,t){let n=e.getNodeUsage(t),r=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(i=>{let o=Kt({elementName:t.name,attributeName:i.name,resolvedNodeType:r});return o?[{attribute:i,info:o,parseResult:Le(i.value)}]:[]})}function F(e,t,n){return yt(e.document,t,n)}function qr(e){return{start:0,end:e.value.length}}function J(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?lt(e,t).map(i=>{let o=Fr(e,[]);return{...i,environment:o,analysis:i.parseResult.ok?Ue({program:i.parseResult.program,environment:o,attributeName:i.attribute.name}):void 0}}):Fs(e,r).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function Fs(e,t){let n=Or.get(e.view);n||(n=new WeakMap,Or.set(e.view,n));let r=n.get(t);if(r)return r;let i=t.nodes.flatMap(s=>lt(e,s.element).map((a,d)=>({id:`${s.path.join(".")}:${a.attribute.name}:${d}`,node:s,candidate:a}))),o=Ht({baseEnvironment:Fr(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 d=i[a];return d?[{...s,node:d.node,candidate:d.candidate}]:[]});return n.set(t,o),o}function Fr(e,t){let n=V(e.semantic),r=[],i=t[0]?.behaviorTree.id;if(i){let o=e.getNodeModel(i);if(o?.kind==="SubTree")for(let s of o.ports){let a=ye(s),u=K(e.semantic,a)?.canonical??a;r.push({name:s.name,type:it(n,a),source:{kind:"subtree-port",nodeType:i,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:u})}}for(let o of t){let s=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let a of o.portBindings){if(a.usage.status!=="resolved")continue;let d=z(a.usage.port.name,a.usage.value);if(!d)continue;let u=ye(a.usage.port),m=K(e.semantic,u)?.canonical??u,p=a.usage.port.direction;r.push({name:d,type:it(n,u),source:{kind:"port-remap",nodeType:s,portName:a.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:m})}}return Yt({symbols:r,augmentations:Vt(e.semantic),areTypesCompatible:(o,s)=>o&&s?ge(e.semantic,o,s):!0})}var Xr=R({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:y.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:F(e,n.attribute,r.range),details:{primaryLabel:`\`${r.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var jr=R({name:"script/valid-assignment",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let i=r.code==="assignment-to-unknown-variable"?y.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?y.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?y.ScriptVariableTypeMismatch:void 0;i&&e.report({code:i,message:r.message,range:F(e,n.attribute,r.range),details:r.details})}}}}});var $r=R({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of J(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:y.InvalidScriptOperandType,message:r.message,range:F(e,n.attribute,r.range),details:r.details})}}}});var zr=R({name:"script/valid-result-type",create(e){return{Element(t){for(let n of J(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let r=n.parseResult.program.statements.at(-1),i=n.analysis.finalType;!r||!i||oe(i)||e.report({code:y.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:F(e,n.attribute,r.range),details:{primaryLabel:"script result is not bool-compatible here",help:"return a boolean or numeric expression, or move side effects into a postcondition/script node"}})}}}}});var Kr=R({name:"script/valid-syntax",create(e){return{Element(t){for(let n of lt(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let i=r.kind==="empty-script"?y.EmptyScript:r.kind==="invalid-token"?y.InvalidScriptToken:y.InvalidScriptSyntax;e.report({code:i,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??F(e,n.attribute,qr(n.attribute)):F(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Gr=[Kr,Xr,jr,$r,zr];var Xs={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Wr(e){return R({name:Xs[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:js(n)})}}}})}function js(e){return e.code?{code:e.code}:void 0}var Yr=[Wr("unused"),Wr("missing-reason")];function ut(e,t){return e.attributes.find(n=>n.name===t)}var Hr=[R({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||ut(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),R({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Be(e.semantic,e.document.uri);for(let r of n?.behaviorTrees??[])r.idRange&&(t.has(r.id)&&e.report({message:`Duplicate BehaviorTree ID: ${r.id}`,range:r.idRange}),t.add(r.id))}}}}),R({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=te(e.semantic,t);if(n.length<=1||new Set(n.map(o=>o.uri)).size<=1)continue;let i=n.filter(o=>o.uri===e.document.uri);i.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:i[0]?.idRange})}}}}}),R({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=ut(t,"main_tree_to_execute");!n?.value||wt(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),R({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(o=>o.name==="ID")??ut(t,"ID");!r||n?.target.status==="resolved"||e.resolveSubTree(r.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${r.value}\``,range:r.valueContentRange||r.valueRange})}}}}),R({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=ut(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})}}}}),R({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var $s=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function zs(e,t){return e===t?String(e):`${e}\u2013${t}`}var Zr=R({name:"model/valid-child-count",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Ks(e,t,n.model.model.id,n.model.model.kind)}}}});function Ks(e,t,n,r){let i=Tr(t).length,o=$s.get(n);if(o){if(i<o.min||i>o.max){let s=zs(o.min,o.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${i}.`,range:t.range})}return}if(r==="Action"||r==="Condition"){i>0&&e.report({message:`${r} node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range});return}if(r==="Decorator"){i!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${i}.`,range:t.range});return}if(r==="Control"){i<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}r==="SubTree"&&i>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range})}var Jr=R({name:"model/valid-port-value",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&rt(e,{port:i.port,value:r.value,range:r.range,registry:V(e.semantic),typeDefinition:K(e.semantic,i.port.type),allowRemap:!0,diagnosticCode:y.InvalidPortValueType,customLiteralDiagnosticCode:y.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Qr=R({name:"model/require-port",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports)!r.required||n.portUsages.some(o=>o.name===r.name&&o.status==="resolved")||e.report({message:`missing required port \`${r.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${r.name}\``:`SubTree requires port \`${r.name}\``,help:`add \`${r.name}="..."\` or provide a blackboard reference such as \`${r.name}="{value}"\``}:void 0})}}}});var ei=[R({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(O(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Control"&&r!=="Decorator"||e.report({message:`${r} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),R({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(O(t)||t.selfClosing||vr(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Action"&&r!=="Condition"&&r!=="SubTree"||e.report({message:`${r} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var ti=R({name:"model/no-unknown-node",create(e){return{Element(t){let n=e.getNodeUsage(t);if(n.tagForm==="root"||n.tagForm==="behavior-tree"||n.tagForm==="tree-nodes-model"||n.tagForm==="include"||n.tagForm==="model-definition"||n.tagForm==="subtree"||n.tagForm==="unknown-xml"||n.model.status==="resolved"||n.model.status==="ambiguous")return;let r=t.attributes.find(i=>i.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:r?.valueContentRange??r?.valueRange??t.range})}}}});var ni=R({name:"model/no-unknown-port",create(e){return{Element(t){if(O(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let i=n.ports.map(s=>s.name).sort(),o=i.length>=1&&i.length<=8?[`note: defined ports: ${i.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${r.name}\``,range:r.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${r.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${r.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:o}:void 0})}}}}});var ri=[ti,ni,Qr,Jr,...ei,Zr];function Gs(e,t){return e.attributes.find(n=>n.name===t)}function Ws(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var ii=[R({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:y.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||Gs(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},R({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)||Ws(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var nn=[...ii,...Gr,...Hr,...Nr,...ri,...br,...Yr],Sp=new Map(nn.map(e=>[e.name,e]));function oi(e){if(e!=="off")return e==="info"?b.Info:e==="warn"?b.Warning:b.Error}function si(e,t){return Ze(e.linter.rules[t])?.options??{}}function ai(e){let t=Ze(e.config.linter.rules[e.rule]);return oi(t?t.severity:e.defaultSeverity)}function di(e){let t=[],n=e.facts??fr(),r=e.rules?new Set(e.rules):void 0,i=[];for(let s of nn){if(r&&!r.has(s.name))continue;let a=ai({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let d=si(e.config,s.name),u=s.optionsSchema?.safeParse(d),l=u?.success?u.data:d,m=Sr({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:l,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});i.push(s.create(m))}for(let s of i)s.Document?.();e.document.root&&li(e.document.root,i);let o=Be(e.semantic,e.document.uri);for(let s of o?.treeNodesModel??[])for(let a of i)a.TreeNodeModel?.(s);for(let s of i)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Ys(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function li(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&li(n,t)}function Ys(e,t){let n=e.range,r=t.range;return!n&&!r?0:n?r?n.start.line-r.start.line||n.start.character-r.start.character||n.end.line-r.end.line||n.end.character-r.end.character:-1:1}function ae(e,t){let n=ee(e,{uri:t.uri,path:t.path});if(!n.ok||!n.document)return{ok:!1,diagnostics:[...n.diagnostics]};let r=n.document,i=Ie([r],{config:t.config,augmentations:t.augmentations}),o=tt(r,{semantic:i.index,config:t.config,policy:me(t.config)}),s=di({document:r,view:o,semantic:i.index,config:t.config}),a=[...n.diagnostics,...i.diagnostics,...s];return{ok:!a.some(d=>d.severity===b.Error),diagnostics:a}}function ui(e,t){let n=ae(e,{config:t.config,uri:t.uri,path:t.path}),r=[...n.diagnostics],i,o=!1,s=!1;if(t.format!==!1){let d=he(e,t.config.formatter);r.push(...d.diagnostics),d.ok&&d.skipped?s=!0:d.ok&&!d.skipped&&(i=d.text,o=d.changed)}return n.ok&&!o&&r.every(d=>d.severity!=="error")?{ok:!0,diagnostics:r,formattedText:i,needsFormat:!1,skipped:s}:{ok:!1,diagnostics:r,formattedText:i,needsFormat:o,skipped:s}}function ci(e,t){return!e.isBtXml}async function pi(e){let t=e.inputs.map(s=>{let a=ee(s.text,{uri:s.uri,path:s.path,kind:s.kind});return{input:s,result:a}}),n=t.flatMap(({result:s})=>s.document&&!ci(s.document,e)?[s.document]:[]),r=Ie(n,{config:e.config}),i=t.map(({input:s,result:a})=>{let d=a.document;if(!a.ok)return{uri:s.uri,path:s.path,diagnostics:a.diagnostics,skipped:!1,formatted:!1};if(d&&ci(d,e))return{uri:s.uri,path:s.path,diagnostics:[],skipped:!0,skipReason:"not detected as BT XML",formatted:!1};let u=d&&At(r.index,d.uri)?ae(s.text,{config:e.config,uri:s.uri,path:s.path}).diagnostics:a.diagnostics;return{uri:s.uri,path:s.path,diagnostics:u,skipped:!1,formatted:!1}}),o={files:i.length,errors:r.diagnostics.filter(s=>s.severity===b.Error).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Error).length,warnings:r.diagnostics.filter(s=>s.severity===b.Warning).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Warning).length,infos:r.diagnostics.filter(s=>s.severity===b.Info).length+i.flatMap(s=>s.diagnostics).filter(s=>s.severity===b.Info).length};return{ok:o.errors===0,files:i,projectDiagnostics:r.diagnostics,summary:o}}import{z as c}from"zod";var mi=c.object({line:c.number(),character:c.number(),offset:c.number()}).strict(),rn=c.object({start:mi,end:mi}).strict(),Hs=c.object({primaryLabel:c.string().optional(),help:c.string().optional(),notes:c.array(c.string()).optional()}).strict(),Zs=c.object({uri:c.string(),range:rn,message:c.string()}).strict(),fi=c.object({code:c.string(),rule:c.string().optional(),severity:c.enum(["error","warning","info"]),message:c.string(),uri:c.string(),range:rn.optional(),relatedInformation:c.array(Zs).optional(),suppressed:c.boolean().optional(),details:Hs.optional(),data:c.record(c.string(),c.unknown()).optional()}).strict(),Js=c.object({path:c.string(),diagnostics:c.array(fi),needsFormat:c.boolean().optional(),skipped:c.boolean().optional(),skipReason:c.string().optional()}).strict(),Qs=c.object({ok:c.boolean(),version:c.literal(2),schemaVersion:c.literal("2"),toolVersion:c.string(),project:c.record(c.string(),c.unknown()),projectDiagnostics:c.array(fi),files:c.array(Js),summary:c.object({files:c.number(),errors:c.number(),warnings:c.number(),infos:c.number(),suppressed:c.number(),baselineFiltered:c.number()}).strict()}).strict(),ct=c.object({definitionId:c.string(),uri:c.string().optional(),range:rn.optional()}).strict(),ea=ct.extend({sourceKind:c.string(),kind:c.string(),signatureId:c.string(),signatureText:c.string()}).strict(),ta=c.object({id:c.string(),signatureKey:c.string(),signatureText:c.string(),definitions:c.array(ct),editableDefinitions:c.array(ct),nonEditableDefinitions:c.array(ct)}).strict(),na=c.object({files:c.number(),definitions:c.number(),edits:c.number(),affectedUris:c.array(c.string())}).strict(),ra=c.object({id:c.string(),title:c.string(),description:c.string(),kind:c.enum(["match-signature","keep-model-definition","keep-port-definition","manual","skip"]),applicable:c.boolean(),targetSignatureId:c.string().optional(),editSummary:na,workspaceEdits:c.array(c.unknown()).optional(),usageImpact:c.unknown().optional(),warnings:c.array(c.string()).optional()}).strict(),ia=c.object({nodeId:c.string(),totalUsages:c.number(),byPort:c.record(c.string(),c.unknown())}).strict(),oa=c.object({key:c.string(),label:c.string()}).strict(),sa=c.object({id:c.string(),kind:c.enum(["model-signature-conflict","duplicate-model-id","duplicate-port-name"]),nodeId:c.string(),portName:c.string().optional(),displayName:c.string(),codes:c.array(c.string()),severity:c.enum(["error","warning"]),pairwiseConflictCount:c.number(),definitions:c.array(ea),signatures:c.array(ta),differences:c.array(c.unknown()),usageEvidence:ia,usageImpacts:c.array(c.unknown()),differencePattern:oa,actions:c.array(ra)}).strict(),aa=c.object({ok:c.boolean(),version:c.literal(2),schemaVersion:c.literal("2"),toolVersion:c.string(),groups:c.array(sa),summary:c.object({groups:c.number(),signatureConflictGroups:c.number(),duplicateModelGroups:c.number(),duplicatePortGroups:c.number(),pairwiseSignatureConflicts:c.number(),errors:c.number(),warnings:c.number()}).strict()}).strict();export{pi as checkBtWorkspace,ui as checkBtXml,Ct as createInitConfig,he as formatBtXml,He as getEffectiveConfigForFile,It as getEffectiveConfigForUri,Qs as jsonCheckReportSchema,aa as jsonRepairReportSchema,Nt as normalizeBtxmlConfig,Ne as parseBtxmlConfig,ae as validateBtXml};